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

标签 c# asp.net async-await

我们已经开始在 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/

相关文章:

c# - 填写表格并打印文档

c# - 无法将 HttpPostedFileBase 对象转换为字节数组

c# - 将打开文件对话框添加到 dll 库

c# - Scaffold-DbContext 在.net core 中抛出错误 "Could not find assembly"

javascript - 当用户点击动态创建的链接时如何调用 JS 方法。 JQuery、ASP.NET MVC

c# - 允许使用Task.Run异步运行任何方法的.Net Framework中的* Async方法的目的是什么?

asp.net - 如何调试 : w3wp. exe 进程由于堆栈溢出而终止(在一台机器上有效,但在另一台机器上无效)

c# - asp.net中如何删除cookies

c# - 使用异步等待在 ForEach 中获取 "The connection does not support MultipleActiveResultSets"

C# 异步/等待未观察到的异常