C# 致命的例外,如何抓住?System.Net.InternalException:系统错误

C# 致命的例外,如何抓住?System.Net.InternalException:系统错误,c#,.net,exception,asynchronous,httpwebrequest,C#,.net,Exception,Asynchronous,Httpwebrequest,这被未处理的异常处理程序捕获。它只是偶尔发生,但会带来灾难性的后果。你知道怎么抓住这个家伙吗 更新 现在很明显,这种情况只出现在CPU负载异常高的情况下。听起来像是连接断开了。如果您使用异步调用,这一点尤其正确。当连接断开时,任何时候尝试访问对象时,都会出现如下错误。下面是一篇关于它的文章: 如果在I/O完成线程上抛出此异常,基本上不需要您的任何干预,那么我倾向于使用打开一个票证。推理:您启动一个异步I/O操作,该操作可能会引发一个异常,这可能是由于线程池中自己的连接断开造成的——您无法捕获。这

这被未处理的异常处理程序捕获。它只是偶尔发生,但会带来灾难性的后果。你知道怎么抓住这个家伙吗

更新


现在很明显,这种情况只出现在CPU负载异常高的情况下。

听起来像是连接断开了。如果您使用异步调用,这一点尤其正确。当连接断开时,任何时候尝试访问对象时,都会出现如下错误。下面是一篇关于它的文章:


如果在I/O完成线程上抛出此异常,基本上不需要您的任何干预,那么我倾向于使用打开一个票证。推理:您启动一个异步I/O操作,该操作可能会引发一个异常,这可能是由于线程池中自己的连接断开造成的——您无法捕获。这意味着,在异步操作期间,可能会出现连接断开的情况,从而导致应用程序宕机,而您对此无能为力。对我来说,这听起来像是框架中的一个bug


临时解决方法可以是在应用程序配置的
部分放置
。这将恢复到.NET 1.0/1.1行为,在该行为中,在主线程以外的另一个线程上引发的异常不会关闭应用程序。另请参见:

我们也遇到了同样的问题,并且能够从Microsoft支持部门获得这方面的帮助。对我们来说,这是由我们禁用Nagle算法导致的winsock api中的竞争条件造成的。如果你发现自己处于同样的情况,你可能想看看我的博客帖子:。

是的。我同意,但我不知道如何捕获此异常(除了在未处理的异常处理程序中,此时为时已晚),因为它是在IOCompletion线程上抛出的。@Tom-如果在抛出错误时无法捕获错误本身(您是否尝试捕获代码中的所有异常,以查看它是否确实发生在您的控制之外?),在使用连接信息之前,您可以尝试检查连接是否已断开。这可能需要在代码中做很多额外的工作,但这是我看到的唯一可行的选择,除了捕获异常。听起来有点。。模糊不清的。。不太清楚你的意思。据我所知,我正在捕获代码中的所有异常,问题是这发生在io完成线程上。。我能想到的最好办法就是重新启动进程。连接检查,嗯?你的意思是“互联网在吗?”。。“不幸的是,我担心没有那么简单。”安德鲁:真的吗?为什么?你有答案吗?我应该接受哪一个问题的答案,我应该选择哪一个答案,为什么?谢谢你。我一直在想这些数字和滴答声都是什么。我在你的两条评论上都加了一条,希望这能让你得到更多的认可。你能发布一些代码来说明你在哪种情况下得到了异常——这可能有助于确定你如何抓住它?或者它只是随机冒出“不知从何而来”?是的,在完成数千次成功的异步http请求后,它不知从何而来。同意。此外,我建议下载并在崩溃模式下使用adplus实用程序(
adplus-crash-pn process_name.exe
),以便获得有助于MS诊断问题的内存转储。这是一个非常有用的答案。
System.Net.InternalException: System error.
   at System.Net.HttpWebRequest.CheckWriteSideResponseProcessing()
   at System.Net.ConnectStream.ProcessWriteCallDone(ConnectionReturnResult retur
nResult)
   at System.Net.HttpWebRequest.WriteCallDone(ConnectStream stream, ConnectionRe
turnResult returnResult)
   at System.Net.ConnectStream.CallDone(ConnectionReturnResult returnResult)
   at System.Net.ConnectStream.CloseInternal(Boolean internalCall, Boolean abort
ing)
   at System.Net.ConnectStream.System.Net.ICloseEx.CloseEx(CloseExState closeSta
te)
   at System.Net.ConnectStream.CloseInternal(Boolean internalCall)
   at System.Net.HttpWebRequest.EndWriteHeaders_Part2()
   at System.Net.HttpWebRequest.EndWriteHeaders(Boolean async)
   at System.Net.HttpWebRequest.WriteHeadersCallback(WebExceptionStatus errorSta
tus, ConnectStream stream, Boolean async)
   at System.Net.ConnectStream.WriteHeadersCallback(IAsyncResult ar)
   at System.Net.LazyAsyncResult.Complete(IntPtr userToken)
   at System.Net.ContextAwareResult.Complete(IntPtr userToken)
   at System.Net.LazyAsyncResult.ProtectedInvokeCallback(Object result, IntPtr u
serToken)
   at System.Net.Sockets.BaseOverlappedAsyncResult.CompletionPortCallback(UInt32
 errorCode, UInt32 numBytes, NativeOverlapped* nativeOverlapped)
   at System.Threading._IOCompletionCallback.PerformIOCompletionCallback(UInt32
errorCode, UInt32 numBytes, NativeOverlapped* pOVERLAP)