【发布时间】:2016-11-02 07:29:52
【问题描述】:
我们已经开始在 asp.net 应用程序中使用 async/await,现在我们在生产中遇到了著名的异常
发生未处理的异常,进程终止。
应用程序 ID:/LM/W3SVC/376/ROOT
进程 ID:3796
异常:System.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 回调,对象状态,任务和当前任务) --- 从先前抛出异常的位置结束堆栈跟踪 --- 在 System.Threading.Tasks.AwaitTaskContinuation.b__1(对象 s) 在 System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext、ContextCallback 回调、对象状态、布尔值 preserveSyncCtx) 在 System.Threading.ExecutionContext.Run(ExecutionContext executionContext、ContextCallback 回调、对象状态、布尔值 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("");
}
但是我们的测试页面从来没有出现异常,好像Test函数中await之后的代码从来没有被调用,并且任务状态是WaitingForActivation,为什么我们在这段代码中没有出现异常?
【问题讨论】:
-
try catch block araound await?
-
this.Title = "test";可以为 null 如果页面已经消失并且您不关心...在页面消失之前等待。
标签: c# asp.net async-await