【发布时间】:2025-12-02 16:35:01
【问题描述】:
我一直在开发的应用程序最近开始遇到我无法解释的间歇性硬崩溃。为了让这更奇怪,我们同时设置了AppDomain.CurrentDomain.UnhandledException 和TaskScheduler.UnobservedTaskException 来捕获此类问题。
通常当出现问题时,上述两个可以正常工作,但在某些情况下,它们没有捕获未处理的异常。更糟糕的是更糟导致这种情况的异常是 NRE,这意味着我们在追踪正在发生的事情方面没有什么可做的。
我的第一个想法是,也许我们在未处理的异常处理程序中的代码可能会引发异常,所以我们在这里加倍处理异常,但到目前为止这并没有任何区别。我们的日志也无法说明这一点。
这可能是 webapi 和/或我们用于托管应用程序的 owin 位的错误,我将尝试增加依赖项以查看是否有帮助,但我认为它不会产生任何影响区别。
有没有办法捕获线程池中发生的未处理异常?是否有某种诊断可以让我们获得更多关于发生这种情况的信息?
我无能为力,任何帮助将不胜感激。
System.NullReferenceException: Object reference not set to an instance of an object.
at System.Net.HttpListener.EndGetContext(IAsyncResult asyncResult)
at System.Threading.Tasks.TaskFactory`1.FromAsyncCoreLogic(IAsyncResult iar, Func`2 endFunction, Action`1 endAction, Task`1 promise, Boolean requiresSynchronization)
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()
at Microsoft.Owin.Host.HttpListener.OwinHttpListener.<ProcessRequestsAsync>d__0.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.CompilerServices.AsyncMethodBuilderCore.<ThrowAsync>b__5(Object state)
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()
使用任务时,我们不执行async void,但我们有一个Task.Run 的情况,我们不等待或挂起任务。这是:
Task.Run(() => CleanUpAllExpiredErrors());
此方法清除过期的客户端错误(我们在未处理的客户端错误上捕获客户端堆栈跟踪)。
【问题讨论】:
-
@ScottChamberlain 我不确定是什么原因造成的,它可能是我们的任何控制器或可能的信号集线器......这些是唯一会使用 HttpListener 的东西,但我们有很多这样的东西.
-
@ScottChamberlain 我们没有异步 void,所有东西要么返回一个任务,要么返回一个任务
。不过,有几个地方我们称之为 Task.Run。 -
您是保留
Task.Run返回的任务并等待该任务,还是“一劳永逸”?如果一发不可收拾,请展示一个用法示例。 (另外我正在删除我的旧 cmets 以清理空间) -
我会更新问题
-
@ScottChamberlain 完成
标签: c# exception asp.net-web-api task-parallel-library owin