Asp.net
無需等待完成的非同步程式碼
我目前遇到 IIS 崩潰的問題,在事件日誌中留下以下消息。它們在將我引導到錯誤的實際來源方面並沒有太大幫助,但一些研究表明這只是產生任務但不等待結果的情況,如果父程序完成,它們最終會完成它不能與導致空引用異常的父執行緒相關聯。那是對的嗎?
在大多數情況下,我已經刪除或添加了等待發生的地方,但有些地方很方便。一個這樣的例子是在會話開始時,記憶體記憶體了會話特有的一些細節,但是它們並不是立即重要的,所以我啟動了一項任務來完成這項工作,但不要等待它。
我已經添加了 ConfigureAwait(false),這足以防止將來出現錯誤嗎?聽起來這將刪除我認為可以防止錯誤的執行緒切換。
Task.Run(() => { // Do caching here }).ConfigureAwait(false);ASP.NET 4.0.30319.0
Exception: System.NullReferenceException Message: Object reference not set to an instance of an object. StackTrace: at System.Web.ThreadContext.AssociateWithCurrentThread(Boolean setImpersonationContext) at System.Web.HttpApplication.OnThreadEnterPrivate(Boolean setImpersonationContext) at System.Web.LegacyAspNetSynchronizationContext.CallCallbackPossiblyUnderLock(SendOrPostCallback callback, Object state) at System.Web.LegacyAspNetSynchronizationContext.CallCallback(SendOrPostCallback callback, Object state) at System.Threading.Tasks.AwaitTaskContinuation.RunCallback(ContextCallback callback, Object state, Task& currentTask) --- End of stack trace from previous location where exception was thrown --- at System.Threading.Tasks.AwaitTaskContinuation.<ThrowAsyncIfNecessary>b__1(Object s) at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) at System.Threading.QueueUserWorkItemCallback.System.Threading.IThreadPoolWorkItem.ExecuteWorkItem() at System.Threading.ThreadPoolWorkQueue.Dispatch().NET 執行時
Application: w3wp.exe Framework Version: v4.0.30319 Description: The process was terminated due to an unhandled exception. Exception Info: System.NullReferenceException Stack: at System.Threading.Tasks.AwaitTaskContinuation.<ThrowAsyncIfNecessary>b__1(System.Object) at System.Threading.ExecutionContext.RunInternal(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean) at System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean) at System.Threading.QueueUserWorkItemCallback.System.Threading.IThreadPoolWorkItem.ExecuteWorkItem() at System.Threading.ThreadPoolWorkQueue.Dispatch()應用程序錯誤
Faulting application name: w3wp.exe, version: 7.5.7601.17514, time stamp: 0x4ce7afa2 Faulting module name: KERNELBASE.dll, version: 6.1.7601.18015, time stamp: 0x50b8479b Exception code: 0xe0434352 Fault offset: 0x0000000000009e5d Faulting process id: 0x1d98 Faulting application start time: 0x01ceaf8ea10ece66 Faulting application path: c:\windows\system32\inetsrv\w3wp.exe Faulting module path: C:\Windows\system32\KERNELBASE.dll Report Id: 341b9a76-1b82-11e3-8e17-005056be0005
經過一上午的時間追逐這個問題,我最終發現有一條路徑可以讓父母繞過造成這個問題的等待。快速重構以防止這種情況解決了問題。
在最簡單的形式中,導致問題的程式碼大致如下:
var getDataTask = getData(); if(some_condition == true) { return some_object; } getDataTask.Wait(); return getDataTask.result;如果
some_condition == true方法將返回而不等待getDataTask完成。重構以停止修復它。