async/await抛出NullReferenceException,我们如何诊断我们在哪里搞砸了?
本文关键字:我们 诊断 在哪里 何诊断 抛出 await NullReferenceException async | 更新日期: 2023-09-27 17:53:32
我们已经开始在asp.net应用程序中使用async/await,现在我们在生产中得到著名的异常
发生未处理的异常,进程被终止。
应用ID:/LM/W3SVC/376/ROOT
进程ID: 3796
例外:系统。得到NullReferenceException
消息:对象引用未设置为对象的实例。
加:在System.Web.ThreadContext.AssociateWithCurrentThread(布尔setImpersonationContext)System.Web.HttpApplication.OnThreadEnterPrivate(布尔setImpersonationContext)System.Web.LegacyAspNetSynchronizationContext.CallCallbackPossiblyUnderLock (SendOrPostCallback(对象状态)System.Web.LegacyAspNetSynchronizationContext.CallCallback (SendOrPostCallback(对象状态)System.Threading.Tasks.AwaitTaskContinuation.RunCallback (ContextCallback对象状态,任务¤tTask)——从抛出异常的前一个位置开始的堆栈跟踪结束——atSystem.Threading.Tasks.AwaitTaskContinuation.b__1(对象年代)System.Threading.ExecutionContext.RunInternal (ExecutionContextexecutionContext, ContextCallback, callback,对象状态,布尔值preserveSyncCtx)System.Threading.ExecutionContext.Run (ExecutionContextexecutionContext, ContextCallback, callback,对象状态,布尔值preserveSyncCtx)System.Threading.QueueUserWorkItemCallback.System.Threading.IThreadPoolWorkItem.ExecuteWorkItem ()在System.Threading.ThreadPoolWorkQueue.Dispatch ()
有什么方法可以让我们获得更多关于产生问题的代码/任务的信息?
第二个问题:我们试图在一个简单的测试webform应用程序中重现本地异常
protected void Page_Load(object sender, EventArgs e)
{
LogMessageToFile("before_task");
var t = Test();
tasks.Add(t);
}
async Task Test()
{
await Task.Run(() =>
{
LogMessageToFile("inside_task");
Thread.Sleep(1000);
}
);
this.Title = "test";
LogMessageToFile("after_task");
// throw new Exception("");
}
,但我们从来没有得到异常在我们的测试页面似乎等待后的代码在测试函数从未被调用和任务状态是WaitingForActivation,为什么我们没有得到异常在这段代码?
调用堆栈中的遗留类型(LegacyAspNetSynchronizationContext
)表明您的web.config
设置不正确。"targetFramework
"设置为"4.5
"或更高。
async
/await
在早期版本的ASP.NET中导致未定义的行为。
为什么我们在这段代码中没有得到异常?
因为您可能将故障应用程序更新为4.5+(打开"quirks模式",使await
无法使用),但创建了一个新的测试应用程序为4.5+(关闭"quirks模式",允许await
工作)。
我想从"等待"回来后,HTTP请求进程已经完成,此时HttpContext应该为空。https://referencesource.microsoft.com/#system.web/ThreadContext.cs,56然后引起NullReferenceException