//
// This example shows that you can call an async task and wait for it to finish
// The result of the async task (in this case the size of the file that has been downloaded)
// will be come available when the task has finished
// The calling code (The Start()) function will not have to wait until the async task has
// finished. That is why the line "2....." will be printed before the results from TestClass.DoTest()
// The sample also shows an event and displays the thread id's. You can see that the DownloadFileTaskAsync() method
// starts multiple threads to download the web document in multiple pieces.
USING System
USING System.Threading.Tasks
FUNCTION Start() AS VOID
? "1. calling long process"
TestClass.DoTest()
? "2. this should be printed while processing"
Console.ReadKey()
CLASS TestClass
STATIC PROTECT oLock AS OBJECT // To make sure we synchronize the writing to the screen
STATIC CONSTRUCTOR
oLock := OBJECT{}
ASYNC STATIC METHOD DoTest() AS VOID
LOCAL Size AS INT64
Size := AWAIT LoooongProcess()
? "3. returned from long process"
? Size, " Bytes downloaded"
ASYNC STATIC METHOD LoooongProcess() AS Task<INT64>
VAR WebClient := System.Net.WebClient{}
VAR FileName := System.IO.Path.GetTempPath()+"temp.txt"
webClient:DownloadProgressChanged += OnDownloadProgress
webClient:Credentials := System.Net.CredentialCache.DefaultNetworkCredentials
AWAIT webClient:DownloadFileTaskAsync("http://www.xsharp.info/index.php", FileName)
VAR dirInfo := System.IO.DirectoryInfo{System.IO.Path.GetTempPath()}
VAR Files := dirInfo:GetFiles("temp.txt")
IF Files:Length > 0
System.IO.File.Delete(FileName)
RETURN Files[1]:Length
ENDIF
RETURN 0
STATIC METHOD OnDownloadProgress (sender AS OBJECT, e AS System.Net.DownloadProgressChangedEventArgs) AS VOID
BEGIN LOCK oLock
? String.Format("{0,3} % Size: {1,8:N0} Thread {2}", 100*e:BytesReceived / e:TotalBytesToReceive , e:BytesReceived, ;
System.Threading.Thread.CurrentThread:ManagedThreadId)
END LOCK
RETURN
END CLASS