Moj*_*aba 10 c# asp.net async-await
我们已经开始在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( System.Threading.Tasks.AwaitTaskContinuation.RunCallback中的SendOrPostCallback回调,对象状态)(ContextCallback回调,对象状态,任务和当前任务)---从抛出异常的先前位置的堆栈跟踪结束---在System.Threading.Tasks.在System.Threading.ExecutionContext.Run(ExecutionContext executionContext,ContextCallback callback,Object state,Boolean preserveSyncCtx)的System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext,ContextCallback callback,Object state,Boolean preserveSyncCtx)中的AwaitTaskContinuation.b__1(Object s)at at System.Threading.QueueUserWorkItemCal System.Threading.ThreadPoolWorkQueue.Dispatch()中的lback.System.Threading.IThreadPoolWorkItem.ExecuteWorkItem()
有什么方法可以获得有关产生问题的代码/任务的更多信息吗?
第二个问题:我们尝试在一个简单的测试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("");
}
Run Code Online (Sandbox Code Playgroud)
但是我们从来没有在我们的测试页面中得到异常,似乎在Test函数中await之后的代码从未被调用过,而任务状态是WaitingForActivation,为什么我们在这段代码中没有得到异常?
Ste*_*ary 13
LegacyAspNetSynchronizationContext调用堆栈中的旧类型()表示您的web.config设置不正确.设置targetFramework为4.5或更高.
async/ await导致早期版本的ASP.NET上的未定义行为.
为什么我们在这段代码中没有异常?
因为您可能已将损坏的应用程序更新为4.5+(打开"怪癖模式",渲染await无法使用),但为4.5+ 创建了一个新的测试应用程序(关闭"怪癖模式",允许await工作).
| 归档时间: |
|
| 查看次数: |
3922 次 |
| 最近记录: |