我们已经开始在 ASP.NET 应用程序中使用 async/await,现在我们在生产中遇到了著名的异常
An unhandled exception occurred and the process was terminated.
Application ID: /LM/W3SVC/376/ROOT
Process ID: 3796
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.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()
我们有什么方法可以获得有关出现问题的代码/任务的更多信息吗?
第二个问题:我们尝试在一个简单的测试 Web 表单应用程序中本地重现异常
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("");
}
但是我们在测试页面中从未得到异常,似乎测试函数中await之后的代码从未被调用,并且任务状态为WaitingForActivation,为什么我们在这段代码中没有得到异常?
最佳答案
调用堆栈中的旧类型 (LegacyAspNetSynchronizationContext
) 表明您的 web.config
settings是不正确的。将 targetFramework
设置为 4.5
或更高版本。
async
/await
在早期版本的 ASP.NET 上导致未定义的行为。
why we do not get exception in this code?
因为您可能将损坏的应用程序更新到 4.5+(这打开了“怪异模式”,导致 await
无法使用),但创建了一个新的 em> 测试 4.5+ 的应用程序(关闭“怪异模式”,允许 await
工作)。
关于c# - async/await 抛出 NullReferenceException 我们如何诊断哪里搞砸了?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38119095/