我一直在开发的应用程序最近开始出现间歇性的硬崩溃,但我无法解释原因。更奇怪的是,我们都设置了
我的第一个想法是,也许我们在未处理的异常处理程序中的代码可能会抛出异常,所以我们加倍处理了异常,但到目前为止还没有任何改变。我们拥有的日志也无法阐明这一点。
这可能是WebAPI和/或我们使用来托管应用程序的OWIN部分的错误,因此我将尝试升级依赖项以查看是否有帮助,但我不认为这会有任何不同。
有没有办法捕获在线程池中发生的未处理异常?是否可以启用某种诊断工具以获取更多信息以确定问题出现的位置?
我已经束手无策了,非常感谢您的帮助。
这个方法清理过期的客户端错误(我们在未处理的客户端错误上捕获客户端堆栈跟踪)。
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());
这个方法清理过期的客户端错误(我们在未处理的客户端错误上捕获客户端堆栈跟踪)。
Task.Run
。 - jonniiTask.Run
返回的任务并等待任务完成,还是采用“fire and forget”的方式?如果使用“fire and forget”,请提供一个使用示例。(我也要删除我的旧评论以清理空间) - Scott Chamberlain