UnobservedTaskException - 任务从何而来

Posted

技术标签:

【中文标题】UnobservedTaskException - 任务从何而来【英文标题】:UnobservedTaskException - Where did the task come from 【发布时间】:2016-02-15 08:50:22 【问题描述】:

在我的 MVC 应用程序中,我有时会遇到如下异常:

System.Net.WebException: The request was aborted: The request was canceled.
   at System.Net.HttpWebRequest.BeginGetRequestStream(AsyncCallback callback, Object state)
   at System.Net.Http.HttpClientHandler.StartGettingRequestStream(RequestState state)
   at System.Net.Http.HttpClientHandler.<>c__DisplayClass4.<PrepareAndStartContentUpload>b__0(Task task)
   at System.Threading.Tasks.Task.Execute()
   --- End of inner exception stack trace ---

编辑 这是我看到的另一种:

System.Exception: Unhandled Task Error ---> System.NullReferenceException: Object reference not set to an instance of an object.
   at System.Web.HttpApplication.PipelineStepManager.ResumeSteps(Exception error)
   at System.Web.HttpApplication.ResumeStepsFromThreadPoolThread(Exception error)
   at System.Web.HttpApplication.CallHandlerExecutionStep.OnAsyncHandlerCompletion(IAsyncResult ar)
   at System.Threading.Tasks.Task.Execute()
   --- End of inner exception stack trace ---

这是我在事件日志中看到的,但它在时间或计数上并不完全相关。

A fatal alert was generated and sent to the remote endpoint. This may result in termination of the connection. The TLS protocol defined fatal error code is 40. The Windows SChannel error state is 1205.

An TLS 1.2 connection request was received from a remote client application, but none of the cipher suites supported by the client application are supported by the server. The SSL connection request has failed.

/编辑

有没有办法识别异常的来源/位置或获取有关异常来自何处的任何其他信息?

编辑 2 这是我看到的另一个。它们都与OnAsyncHandlerCompletion有关,但我不确定来源是什么。

System.Exception: Unhandled Task Error ---> System.NullReferenceException: Object reference not set to an instance of an object.
at System.Web.HttpApplication.get_CurrentModuleContainer()
at System.Web.HttpApplication.PipelineStepManager.ResumeSteps(Exception error)
at System.Web.HttpApplication.ResumeStepsFromThreadPoolThread(Exception error)
at System.Web.HttpApplication.CallHandlerExecutionStep.OnAsyncHandlerCompletion(IAsyncResult ar)
at System.Threading.Tasks.Task.Execute()
--- End of inner exception stack trace ---

/编辑 2

【问题讨论】:

使用 fiddler 或 wireshark 之类的嗅探器从 http 获取错误消息。您可以查看管理工具:事件查看器以获取更多详细信息。 您不知道您的应用在哪里发出 http 请求? @jdweng Fiddler/wireshark 会给出一些上下文,但我正在寻找有助于识别代码位置的东西。 @YuvalItzchakov 我知道它发出请求的位置。我试图避免去每个位置都用try/catch来点缀它,只是为了寻找一个位置。这不是一个小/琐碎的 CRUD 应用程序。 :) 能够在此位置收集信息或通过更改任务计划程序的另一个好处是可以轻松识别未来的问题,而无需追踪发出 HTTP 请求的新位置。 这是仅在 prod 中重现还是在 dev 中重现? 【参考方案1】:

您可以订阅TaskScheduler.UnobservedTaskException 事件,或许可以获得有关异常的更多信息。

【讨论】:

这就是我目前得到异常的地方。我只是在记录它,并对它的起源感到好奇,因为它几乎没有有用的信息。 我仍然没有找到查看原始错误位置的方法。另请注意,“找不到对象引用”并不意味着这是您的代码中的错误。我刚刚通过显式抛出一个“成为”空引用异常的未处理异常来验证这一点:-(

以上是关于UnobservedTaskException - 任务从何而来的主要内容,如果未能解决你的问题,请参考以下文章

WPF异常捕获三种处理 UI线程, 全局异常,Task异常