.Net 多线程 异步编程 Await、Async和Task
生活随笔
收集整理的這篇文章主要介紹了
.Net 多线程 异步编程 Await、Async和Task
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
await和async簡介
??await和async是在C#5中引入,并且在.NetFramewor4.5以及.NetCore中進行了支持。主要是解決性能瓶頸,并且增強系統的響應能力。
以上demo詳細的描述了使用await時程序的運行機制,需要注意的以下幾點:
- 第五步:執行完成后如果發現下一步還有await即設置了中斷點,此時命令會直接跳出此方法即執行6,換句話說,await表達式執行時暫停并不構成方法退出,只會導致 finally 代碼塊不運行。
- 第七步:當執行當getStringTask返回結果(第七步)及await等待方法執行完成開始執行后續操作時(8)此時的線程已經和第四步執行的線程不同編號了,但是此時4所在線程上下文中的AsyncLocal變量會被復制到await返回后的線程上下文中。詳細參照https://www.cnblogs.com/liyong-blackStone/p/10270526.html
- async 和 await 關鍵字不會創建其他線程。 因為異步方法不會在其自身線程上運行,因此它不需要多線程.
Task簡介
Task類的表示單個操作不會返回一個值,通常以異步方式執行Task對象是一種的中心思想基于任務的異步模式。首次引入.NET Framework 4 中。
Task可以通過以下幾種方式開始執行:
task的執行方式這里不多做介紹,下面主要說下Task的異常處理。
異步方法內部的異常處理
.Net中異步方法由 async修飾符標記,通常包含一個或多個await表達式或語句。await表達式將await運算符應用于 Task 或Task。由于在異步方法中通常會存在多個線程,而子線程中的異常信息不能自動的拋到主線程上,所以要想在主線程上獲得子線程的異常信息,需要借助于返回的task這個對象。以下為Msdn給出的一段示例代碼:
public async Task DoSomethingAsync() {Task<string> theTask = DelayAsync();try{string result = await theTask;Debug.WriteLine("Result: " + result);}catch (Exception ex){Debug.WriteLine("Exception Message: " + ex.Message);}Debug.WriteLine("Task IsCanceled: " + theTask.IsCanceled);Debug.WriteLine("Task IsFaulted: " + theTask.IsFaulted);if (theTask.Exception != null){Debug.WriteLine("Task Exception Message: "+ theTask.Exception.Message);Debug.WriteLine("Task Inner Exception Message: "+ theTask.Exception.InnerException.Message);} }private async Task<string> DelayAsync() {await Task.Delay(100);// Uncomment each of the following lines to// demonstrate exception handling.//throw new OperationCanceledException("canceled");//throw new Exception("Something happened.");return "Done"; }// Output when no exception is thrown in the awaited method: // Result: Done // Task IsCanceled: False // Task IsFaulted: False// Output when an Exception is thrown in the awaited method: // Exception Message: Something happened. // Task IsCanceled: False // Task IsFaulted: True // Task Exception Message: One or more errors occurred. // Task Inner Exception Message: Something happened.// Output when a OperationCanceledException or TaskCanceledException // is thrown in the awaited method: // Exception Message: canceled // Task IsCanceled: True // Task IsFaulted: False對于異步線程的執行結果,最多有三種情況
- 正常執行結束:可以通過IsCompletedSuccessfully 屬性表示任務正常結束,并成功執行。特別說明:IsCompleted為true只能表示執行完成,當任務處于三種最終狀態之一: RanToCompletion, Faulted,或Canceled。時他都為true
- 發生異常:發生異常時,可以通過返回的task對象中的IsFaulted屬性判斷,為true時表示發生異常,如果要獲取具體的異常信息,可以通過以下以下方式獲取
- 異步線程被取消:異步線程被取消時task中的IsCanceled屬性會被設置為true
了解取消任務可以參考msdn示例:
轉載于:https://www.cnblogs.com/liyong-blackStone/p/10276769.html
總結
以上是生活随笔為你收集整理的.Net 多线程 异步编程 Await、Async和Task的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: How does asp.net web
- 下一篇: 实例对象静态对象实例方法静态方法