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