使用 Async 和 Await 的异步编程
下表顯示了異步編程提高響應能力的典型區域。?從 .NET Framework 4.5 和 Windows 運行時中列出的 API 包含支持異步編程的方法。
?| Web 訪問 | HttpClient?,SyndicationClient |
| 使用文件 | StorageFile、StreamWriter、StreamReader、XmlReader |
| 使用圖像 | MediaCapture、BitmapEncoder、BitmapDecoder |
| WCF 編程 | 同步和異步操作 |
| ? | ? |
由于所有與用戶界面相關的活動通常共享一個線程,因此,異步對訪問 UI 線程的應用程序來說尤為重要。?如果任何進程在同步應用程序中受阻,則所有進程都將受阻。?你的應用程序停止響應,因此,你可能在其等待過程中認為它已經失敗。
使用異步方法時,應用程序將繼續響應 UI。?例如,你可以調整窗口的大小或最小化窗口;如果你不希望等待應用程序結束,則可以將其關閉。
當設計異步操作時,該基于異步的方法將自動傳輸的等效對象添加到可從中選擇的選項列表中。?開發人員只需要投入較少的工作量即可使你獲取傳統異步編程的所有優點。
Visual Basic 中的?Async?和?Await?關鍵字,以及 C# 中的?async?和?await?關鍵字都是異步編程的核心。?通過使用這兩個關鍵字,你可以使用 .NET framework 或 Windows 運行時中的資源輕松創建異步方法(幾乎與創建同步方法一樣輕松)。?通過使用被稱為異步方法的 async 和 await 定義的異步方法。
下面的示例演示了一種異步方法。?你應對代碼中的幾乎所有內容都非常熟悉。?注釋調出你添加的用來創建異步的功能。
? // Three things to note in the signature: // - The method has an async modifier. // - The return type is Task or Task<T>. (See "Return Types" section.) // Here, it is Task<int> because the return statement returns an integer. // - The method name ends in "Async." async Task<int> AccessTheWebAsync() { // You need to add a reference to System.Net.Http to declare client.HttpClient client = new HttpClient();// GetStringAsync returns a Task<string>. That means that when you await the// task you'll get a string (urlContents).Task<string> getStringTask = client.GetStringAsync("http://msdn.microsoft.com");// You can do work here that doesn't rely on the string from GetStringAsync. DoIndependentWork();// The await operator suspends AccessTheWebAsync.// - AccessTheWebAsync can't continue until getStringTask is complete.// - Meanwhile, control returns to the caller of AccessTheWebAsync.// - Control resumes here when getStringTask is complete. // - The await operator then retrieves the string result from getStringTask.string urlContents = await getStringTask;// The return statement specifies an integer result.// Any methods that are awaiting AccessTheWebAsync retrieve the length value.return urlContents.Length; }
?
如果?AccessTheWebAsync?在調用?GetStringAsync?和等待其完成期間不能進行任何工作,則你可以通過在下面的單個語句中調用和等待來簡化代碼。
?
API 異步方法 你可能想知道從何處可以找到?GetStringAsync?等支持異步編程的方法。?.NET Framework 4.5 包含使用 async 和 await 的許多成員。?可以通過附加到成員名稱的“Async”后綴和?Task或?Task<TResult>?的返回類型識別這些成員。?例如,System.IO.Stream 類包含的方法?CopyToAsync、ReadAsync、WriteAsync?等方法以及同步方法?CopyTo、Read?和?Write。?
線程 ? ? ? 如果通過使用?Async?或?async?修飾符指定某種方法為異步方法,則可以啟用以下兩個功能。-
標記的異步方法可以使用?Await?或?await?來指定懸掛點。?await 運算符通知編譯器異步方法只有直到等待的異步過程完成才能繼續通過該點。?同時,控件返回至異步方法的調用方。
await 表達式中異步方法的掛起不能使該方法退出,并且?finally?塊不會運行。
-
標記的異步方法本身可以通過調用它的方法等待。
異步方法通常包含 await 運算符的一個或多個匹配項,但缺少 await 表達式不會導致編譯器錯誤。?如果異步方法未使用 await 運算符標記懸掛點,則該方法將作為同步方法執行,不管異步修飾符如何。?編譯器將為此類方法發布一個警告。
Async?、async、Await?和?await?都是上下文關鍵字。?
轉載于:https://www.cnblogs.com/zuiyirenjian/p/4187601.html
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的使用 Async 和 Await 的异步编程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 抱怨是最毒的毒药
- 下一篇: PLSQL安装教程,无需oracle客户