严格来说,ASYNC await 不是语句,而是修饰符。
ASYNC 是方法修饰符,用于表示方法/函数包含异步代码
AWAIT 用于表达式之前,表示操作可能需要一段时间来处理。
编译器会(在幕后)生成一个复杂的机制,将方法的主体分割成 await 之前和 await 之后的部分。当表达式返回时,代码会跳转到需要继续的地方。因此,这属于 JUMP(跳转) 语句。
//
// 这个示例说明,你可以调用一个异步任务并等待它完成。
// 异步任务的结果(在本例中为已下载文件的大小)
// 将在任务完成后可用
// 调用代码(Start())的函数无需等待异步任务完成。
// 完成。这就是为什么在 TestClass.DoTest() 的结果之前会打印出 "2..... "行的原因。
// 示例还显示了一个事件并显示了线程 ID。您可以看到 DownloadFileTaskAsync() 方法
// 启动多个线程下载多个网络文档。
USING System
USING System.Threading.Tasks
FUNCTION Start() AS VOID
? "1. 调用耗时比较长的过程"
TestClass.DoTest()
? "2. 在处理过程中应打印出来"
Console.ReadKey()
CLASS TestClass
STATIC PROTECT oLock AS OBJECT // 确保我们的书写与屏幕同步
STATIC CONSTRUCTOR
oLock := OBJECT{}
ASYNC STATIC METHOD DoTest() AS VOID
LOCAL Size AS INT64
Size := AWAIT LoooongProcess()
? "3. 从漫长的过程中返回"
? Size, " 字节已下载"
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