async/await抛出NullReferenceException我们如何诊断我们搞砸了哪里?

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设置不正确.设置targetFramework4.5或更高.

async/ await导致早期版本的ASP.NET上的未定义行为.

为什么我们在这段代码中没有异常?

因为您可能已将损坏的应用程序更新为4.5+(打开"怪癖模式",渲染await无法使用),但为4.5+ 创建了一个新的测试应用程序(关闭"怪癖模式",允许await工作).

  • 谢谢斯蒂芬,确实有帮助,我正在仔细检查web.config,我们在生产中使用了<compilation targetFramework =“ 4.5.1” />,但没有使用<httpRuntime targetFramework =“ 4.5.1” /> (2认同)