异步I / O是否会抛出无法捕获的异常?

时间:2009-04-10 17:19:30

标签: c# .net exception asynchronous

我有一个多线程.NET应用程序,它使用异步I / O和AsyncCallbacks来处理I / O完成。很少,该应用程序将失败,例如:

Arithmetic operation resulted in an overflow.
   at MyApp.ReadComplete(IAsyncResult ar) in c:\MyApp.cs:line 123
   at System.Net.LazyAsyncResult.Complete(IntPtr userToken)
   at System.Net.ContextAwareResult.CompleteCallback(Object state)
   at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
   at System.Net.ContextAwareResult.Complete(IntPtr userToken)
   at System.Net.LazyAsyncResult.ProtectedInvokeCallback(Object result, IntPtr userToken)
   at System.Net.Sockets.BaseOverlappedAsyncResult.CompletionPortCallback(UInt32 errorCode, UInt32 numBytes, NativeOverlapped* nativeOverlapped)
   at System.Threading._IOCompletionCallback.PerformIOCompletionCallback(UInt32 errorCode, UInt32 numBytes, NativeOverlapped* pOVERLAP)

MyApp.cs中的第123行是AsyncCallback的第一个可执行行,它位于try / catch(Exception ex)中,但是,catch没有被执行。

.NET Framework是否向我说谎发生异常的位置?该异常是否实际发生在async netherworld中,我无法捕获它?为什么我不能抓住这个例外?

2 个答案:

答案 0 :(得分:3)

尝试使用catch而不是catch(Exception ex)。这包括一切。 COM异常。

答案 1 :(得分:0)

实际答案是肯定的,.NET Framework错误地发生了异常,但不是因为异步netherworld中发生了异常。异常实际发生在回调方法中,堆栈跟踪中指示的行之后的许多行。实际发生异常的行不在try / catch块内部,因此预期会出现未处理的异常。

我向Microsoft报告了错误的堆栈跟踪,但不知道它是否被视为错误。

我认为可以肯定地说,如果你的堆栈跟踪指向异步回调方法的第一个可执行行,你应该怀疑它可能是错误的。