假设我有以下代码:
private delegate void DeadlyDelegate();
private void Deadly()
{
throw new Exception("DIE!");
}
public void DoStuff()
{
DeadlyDelegate d = Deadly;
d.BeginInvoke(null, null);
}
现在,已经有很多关于是否需要EndInvoke()的讨论(答案是肯定的),所以我不是这么想的。但是,让我们说无论出于何种原因,永远不会达到EndInvoke(在我的例子中,我根本就没有调用它,但我们可以想象其他原因如何不会被意外调用)。
第一个问题:异常会怎样?它是否完全消失并且永远不会引起问题?或者它最终在垃圾收集期间被抛出作为未处理的异常,就像从未观察到任务异常一样?我已经做了很多搜索,无论是Google还是SO,都找不到答案。
在我自己的代码中,我当然打算总是调用EndInvoke()。但是,如果由于一些意料之外的程序路径,EndInvoke不会被调用,那么知道会发生什么会很好。我不希望我的整个应用程序因为未处理的异常(如果有的话)而停止崩溃。
第二个问题:第一个问题的答案是什么,.NET框架中的内置异步调用也是如此,比如TcpClient.BeginConnect()?如果该方法抛出异常,如果我从不调用EndConnect(),它是否会消失,还是会导致问题?
第三个问题:(这应该是微不足道的,但我认为我会仔细检查)是否有任何方式在异步代码之间发生某种奇怪的未处理/未观察到的异常< / em> BeginInvoke / Connect和EndInvoke / Connect调用?或者我总是保证任何异常都会安全地传播到调用EndInvoke / Connect的位置吗?