C# 如果从未调用EndInvoke,异步方法中的异常会发生什么情况?

C# 如果从未调用EndInvoke,异步方法中的异常会发生什么情况?,c#,asynchronous,exception-handling,C#,Asynchronous,Exception Handling,假设我有以下代码: private delegate void DeadlyDelegate(); private void Deadly() { throw new Exception("DIE!"); } public void DoStuff() { DeadlyDelegate d = Deadly; d.BeginInvoke(null, null); } 现在,已经有很多关于是否需要EndInvoke()的讨论(答案是肯定的),所以我不是问这个问题。但是

假设我有以下代码:

private delegate void DeadlyDelegate();

private void Deadly()
{
    throw new Exception("DIE!");
}

public void DoStuff()
{
    DeadlyDelegate d = Deadly;
    d.BeginInvoke(null, null);
}
现在,已经有很多关于是否需要EndInvoke()的讨论(答案是肯定的),所以我不是问这个问题。但是,不管出于什么原因,EndInvoke永远不会被调用(在我的示例中,我只是不调用它,但我们可以想象它为什么会意外地永远不会被调用的其他原因)

第一个问题:异常发生了什么?它是否完全消失,并且从不引起问题?或者它最终会在垃圾收集过程中作为未处理的异常抛出,就像从未观察到的任务异常一样?我做了很多搜索,包括谷歌搜索和其他搜索,但都没有找到答案

在我自己的代码中,我当然计划始终调用EndInvoke()。但是,如果由于某些意外的程序路径,EndInvoke不知何故没有被调用,那么最好知道会发生什么。我不希望我的整个应用程序因为未处理的异常(如果有)而崩溃停止

第二个问题:无论第一个问题的答案是什么,对于.NET framework中的内置异步调用,如TcpClient.BeginConnect(),是否也是如此?如果该方法抛出异常,如果我从不调用EndConnect(),它会消失吗?或者它仍然会导致问题吗


第三个问题:(这应该很简单,但我想再检查一下)在BeginInvoke/Connect和EndInvoke/Connect调用之间的异步代码中是否存在某种奇怪的未处理/未观察到的异常?或者我总是保证任何异常都会安全地传播到调用EndInvoke/Connect的点吗?

您是否尝试过并看到发生了什么?如果是,你学到了什么?你的问题在这里得到了回答:是的,我尝试过,甚至后来调用GC.Collect()来查看是否出现异常,但到目前为止还没有。但是,我在任务中看到了相同的行为,我知道在任务中异常最终会出现在垃圾收集中,所以答案对我来说不是决定性的。基本上,异常丢失了,它不会终止程序,但它确实终止了调用该方法的线程。此外,如果不调用
EndInvoke
,则会有大约10分钟的泄漏。基本上,做正确的事情。我已经彻底阅读了你链接的问题,但它似乎没有最终回答例外情况将永远不会出现。听起来你是这么说的,所以这对我很有用。