国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > .NET > 正文

ASP.NET 謹用 async/await

2024-07-10 12:48:53
字體:
來源:轉載
供稿:網友

C# 5.0 引入 async/await 關鍵字,旨在簡化異步編程模型,拋去語法糖就是 Net4.0 的 Task + 狀態機。其實在處理異步編程使用 Task 還是挺簡單的,不過既然推出了新的語法糖,難免會嘗試一下,然而在使用中卻沒想象中那么單純。以下針對ASP.NET 應用程序實際使用過程中的一些總結, 包括 異常捕獲 、 死鎖 、 應用程序崩潰 ,實際使用過程中一不注意就可能掉坑里了。

異常捕獲

async 方法有三種返回類型: void、Task、Task

async void

該方式聲明的方法是無法使用 catch 捕獲異常的,所以以下代碼的 try、catch 并沒什么卵用。

private static async void ThrowExceptionAsync(){ await Task.Delay(1000); throw new Exception("拋個異常玩玩");}public static async void CatchAsyncVoidException(){ try {  ThrowExceptionAsync(); } catch (Exception ex) { throw ex; }}

async Task 或 async Task

這兩種方式聲明的方法異常信息會包含Task屬性內,但前提需要在try里面使用 await 等待。

private static async Task ThrowExceptionAsync(){ await Task.Delay(1000); throw new Exception("拋個異常玩玩");}public static async Task CatchAsyncTaskException(){ try {   await ThrowExceptionAsync(); } catch (Exception ex) { throw ex; }}TaskScheduler.UnobservedTaskException

未捕獲的 Task 異常信息可以通過設置全局的TaskScheduler.UnobservedTaskException 來記錄錯誤日志,在 Global.asax 增加如下代碼:

void Application_Start(object sender, EventArgs e){ // 在應用程序啟動時運行的代碼 TaskScheduler.UnobservedTaskException += TaskScheduler_UnobservedTaskExceptionException;}void TaskScheduler_UnobservedTaskExceptionException(object sender, UnobservedTaskExceptionEventArgs e){ if (e.Exception != null) { // do something }}

同步上下文

異步編程必然是關于線程的使用,線程有一個同步上下文的概念,個人認為線程同步上下文是 async/await 遇到最揪心的問題。在現有項目開發中我們可能想嘗試使用 async/await,但老代碼都是同步方式,這時如果調用一個聲明為 async 的方法,死鎖和應用程序崩潰的問題一不小心就可能出現。

注意:控制臺程序和.Net Core程序 將不會遇到這個問題,它們不需要同步上下文。

死鎖

private static async Task XXXAsync(){ await Task.Delay(1000);  // some code}public static void Test(){ var task = XXXAsync(); task.Wait();}

以上代碼很完美的實現了死鎖。 默認情況下,當 Wait() 未完成的 Task 時,會捕獲當前線程上下文,在 Task 完成時使用該上下文恢復方法的執行。 當 async 方法內的 await 執行完成時,它會嘗試獲取調用者線程所在的上下文執行方法的剩余部分, 但是該上下文已含有一個線程,該線程在等待 async 方法完成。然后它們相互等待對方,然后就沒有然后了,死在那里。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 开化县| 和政县| 汤原县| 桑植县| 牙克石市| 南岸区| 铜陵市| 山丹县| 伊金霍洛旗| 嘉定区| 仙游县| 关岭| 平定县| 岑巩县| 巫山县| 田阳县| 渭南市| 阿克苏市| 岳普湖县| 旺苍县| 正宁县| 青阳县| 普安县| 林州市| 奈曼旗| 河曲县| 吴川市| 荣昌县| 达尔| 镇赉县| 吉林市| 彰化市| 融水| 定襄县| 白城市| 秦安县| 商丘市| 疏附县| 泗水县| 贞丰县| 上林县|