我有一个多线程.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中,我无法捕获它?为什么我不能抓住这个例外?
答案 0 :(得分:3)
尝试使用catch而不是catch(Exception ex)。这包括一切。 COM异常。
答案 1 :(得分:0)
实际答案是肯定的,.NET Framework错误地发生了异常,但不是因为异步netherworld中发生了异常。异常实际发生在回调方法中,堆栈跟踪中指示的行之后的许多行。实际发生异常的行不在try / catch块内部,因此预期会出现未处理的异常。
我向Microsoft报告了错误的堆栈跟踪,但不知道它是否被视为错误。
我认为可以肯定地说,如果你的堆栈跟踪指向异步回调方法的第一个可执行行,你应该怀疑它可能是错误的。