我一直在努力的应用程序最近开始遇到间歇性硬崩溃,我无法解释。为了让这个更奇怪,我们设置了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我不知道是什么原因引起的,也可能是我们的任何控制器或可能signalr枢纽......这些都是唯一可以使用HttpListener的东西,但是我们有很多这样的东西。 – jonnii
@ScottChamberlain我们没有异步无效,一切都会返回一个任务或任务。尽管我们有几个地方叫'Task.Run'。 –
jonnii
你是否保留'Task.Run'返回并等待任务的任务,或者你是否“做火和忘记”?如果失火并忘记,请展示一个用例。 (另外我删除了我的旧评论以清除空间) –