国产99久久精品_欧美日本韩国一区二区_激情小说综合网_欧美一级二级视频_午夜av电影_日本久久精品视频

最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
當前位置: 首頁 - 科技 - 知識百科 - 正文

ASP.NET 謹用 async/await

來源:懂視網 責編:小采 時間:2020-11-27 22:35:10
文檔

ASP.NET 謹用 async/await

ASP.NET 謹用 async/await:C# 5.0 引入 async/await 關鍵字,旨在簡化異步編程模型,拋去語法糖就是 Net4.0 的 Task + 狀態機。其實在處理異步編程使用 Task 還是挺簡單的,不過既然推出了新的語法糖,難免會嘗試一下,然而在使用中卻沒想象中那么單純。以下針對ASP.NET 應用程
推薦度:
導讀ASP.NET 謹用 async/await:C# 5.0 引入 async/await 關鍵字,旨在簡化異步編程模型,拋去語法糖就是 Net4.0 的 Task + 狀態機。其實在處理異步編程使用 Task 還是挺簡單的,不過既然推出了新的語法糖,難免會嘗試一下,然而在使用中卻沒想象中那么單純。以下針對ASP.NET 應用程

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 方法完成。然后它們相互等待對方,然后就沒有然后了,死在那里。

針對死鎖問題的解決方式是增加 ConfigureAwait(false)

// await Task.Delay(1000);
await Task.Delay(1000).ConfigureAwait(false); // 解決死鎖

當 await 等待完成時,它會嘗試在線程池上下文中執行 async 方法的剩余部分,因此就不存在死鎖。

應用程序崩潰

測試環境總發現IIS應用程序池總是崩潰,到底是什么原因?當時我們對這個問題也是非常懵逼,代碼看上去并沒什么明顯毛病,試圖欺騙自己應該是環境本身的問題吧,但事實上確實是在代碼中下了毒。通過各種資料查閱和測試,基本可以斷定是同步代碼調用異步代碼,同步上下文引起的問題。

如果調用一個 async 方法。如果使用 await 等待,當前線程立馬被釋放回線程池,線程的上下文信息會被保存。如果沒有使用 await(async void 的方法,必然沒有辦法使用 await),調用 async 方法之后,代碼會繼續往下執行,執行完成后當前線程被釋放回線程池,線程的上下文信息不會被保存。當 async 中的異步任務執行完成后,會從線程池中獲取一個線程繼續執行剩余代碼,同時會獲取當初調用者所在線程的上下文信息(如果當初調用者所在線程沒有釋放回線程池,上下文信息可以獲取到)。那么問題就來了,如果當初調用者沒有使用 await 并且 所在線程釋放回線程池了,上下文信息因為沒有被保持下來,就獲取不到了,這時候會拋出異常 未將對象引用設置到對象的實例 ,經過測試這個異常信息并不一定每次都會出現,原因和線程的釋放有關,調用者所在線程的上下文信息存在就不會拋出異常。異常錯誤信息如下,這個異常最終會導致應用程序集停止。

在 System.Web.ThreadContext.AssociateWithCurrentThread(Boolean setImpersonationContext)
 在 System.Web.HttpApplication.OnThreadEnterPrivate(Boolean setImpersonationContext)
 在 System.Web.LegacyAspNetSynchronizationContext.CallCallbackPossiblyUnderLock(SendOrPostCallback callback, Object state)
 在 System.Web.LegacyAspNetSynchronizationContext.CallCallback(SendOrPostCallback callback, Object state)
 在 System.Web.LegacyAspNetSynchronizationContext.Post(SendOrPostCallback callback, Object state)
 在 System.Threading.Tasks.SynchronizationContextAwaitTaskContinuation.PostAction(Object state)
 在 System.Threading.Tasks.AwaitTaskContinuation.RunCallback(ContextCallback callback, Object state, Task& currentTask)
--- 引發異常的上一位置中堆棧跟蹤的末尾 ---
 在 System.Threading.Tasks.AwaitTaskContinuation.<>c.<ThrowAsyncIfNecessary>b__18_0(Object s)
 在 System.Threading.QueueUserWorkItemCallback.WaitCallback_Context(Object state)
 在 System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
 在 System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
 在 System.Threading.QueueUserWorkItemCallback.System.Threading.IThreadPoolWorkItem.ExecuteWorkItem()
 在 System.Threading.ThreadPoolWorkQueue.Dispatch()
 在 System.Threading._ThreadPoolWaitCallback.PerformWaitCallback()

針對以上異常我們有什么方式可以解決呢?依然是ConfigureAwait(false),在 Task 上加上 ConfigureAwait(false),此設置代表當 async 中的異步任務完成后,不讀取當時調用它的原線程的上下文信息,而是在線程池上下文中執行 async 方法的剩余部分。

public static Task XXXAsync()
{
 await Task.Run(() =>
 {
 // some code
 }).ConfigureAwait(false);
}

總結

以上所述是小編給大家介紹的ASP.NET 謹用 async/await,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對腳本之家網站的支持!

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

文檔

ASP.NET 謹用 async/await

ASP.NET 謹用 async/await:C# 5.0 引入 async/await 關鍵字,旨在簡化異步編程模型,拋去語法糖就是 Net4.0 的 Task + 狀態機。其實在處理異步編程使用 Task 還是挺簡單的,不過既然推出了新的語法糖,難免會嘗試一下,然而在使用中卻沒想象中那么單純。以下針對ASP.NET 應用程
推薦度:
標簽: 使用 net ASP.NET
  • 熱門焦點

最新推薦

猜你喜歡

熱門推薦

專題
Top
主站蜘蛛池模板: 亚洲小说欧美激情另类 | 欧美精品国产一区二区 | 久久久91精品国产一区二区 | 在线视频三区 | 免费在线一级毛片 | 国产97在线看 | 一区免费在线观看 | 国产成人一区二区三区视频免费蜜 | 国产精品久久久久激情影院 | 欧美另类日韩 | 欧美在线看欧美视频免费网站 | 国产欧美精品区一区二区三区 | 老子影院午夜久久亚洲 | 亚洲一区二区三区免费观看 | 日韩亚洲欧美在线 | 欧美三级不卡 | 国产精品久久久久久一级毛片 | 国产成人综合久久精品红 | 国产成人精品一区二区三区… | 精品欧美一区二区在线观看欧美熟 | 精品国产一区二区三区2021 | 欧美a色爱欧美综合v | 日韩www视频 | 国产资源免费 | 欧美日韩亚洲国产 | 欧洲亚洲综合 | 国产精品一区二区三区四区五区 | 欧美h网| 久久久久久91 | 人与禽一级一级毛片 | 国产在线观看不卡 | 欧美一二三 | 国产精品一区二区久久 | 日韩视频在线观看免费 | 国产精品久久一区二区三区 | 欧美第1页 | 国产亚洲综合成人91精品 | 制服丝袜先锋影音 | 欧美孕妇乱大交xxxxx | 免费国产叼嘿视频大全网站 | 亚洲qvod图片区电影 |