EndInvoke()是可选的,是可选的还是绝对不可选的?

我读过关于是否每个BeginInvoke()必须由EndInvoke()匹配的冲突意见。 没有调用EndInvoke()相关的泄漏或其他问题?

Delegate.EndInvoke被logging为一个必须调用这个 (即必要 – 否则泄漏发生) – 从MSDN :

重要的提示

无论您使用哪种技术,总是调用EndInvoke来完成asynchronous调用。

Control.EndInvoke是可以忽略火灾和遗忘的方法 – 从msdn :

您可以调用EndInvoke从代理检索返回值(如果有必要),但这不是必需的。

但是,如果你正在使用Delegate.BeginInvoke而不想得到结果,可以考虑使用ThreadPool.QueueUserWorkItem – 它会使生活变得更容易,并且避免了IAsyncResult等的痛苦。

EndInvoke不是可选的。

更多信息在这里

而EndInvoke调用不是可选的调用,它是合约的一部分。 如果您调用BeginInvoke,则必须调用EndInvoke。

经典的例子,为什么这是必要的。 从BeginInvoke返回的IAsyncResult很可能已经分配了连接到它的资源。 最常见的是一种WaitHandle。 因为IAsyncResult不实现IDisposable,所以必须select另一个地方来释放资源。 唯一的地方是EndInvoke。

我在下面的博客文章中简要讨论这个问题。

http://blogs.msdn.com/jaredpar/archive/2008/01/07/isynchronizeinvoke-now.aspx

EndInvoke不是可选的,因为如果在asynchronous处理中发生错误,它就是引发exception的地方。

无论如何不应该有任何泄漏,因为如果IAsyncResult持有一些原生资源,它应该正确实现IDisposable和处理这些资源时,GC呼吁他的终结器。

这不是可选的,因为调用BeginInvoke使用一个WaitHandle,它依次使用一个内核对象来维护一个有多less引用的计数。 调用EndInvoke会优雅地configuration在内核对象上递减该计数器的句柄,当该计数达到零时,内核对象pipe理器将会销毁它。

如果你不介意你的程序内存增长很大,那么它是唯一可选的。 问题在于GC持有线程中的所有引用,因为您可能要在某个时刻调用EndInvoke。 我会马克的回答,线程池将使您的生活更轻松。 但是,您需要注意是否从线程产生线程,因为线程数量有限。

在这个post上的每个回复都说EndInvoke()不是可选的。 然而,我发现以下排名很高的评论是对这个主题的接受答案:

“请注意,Windows Forms团队已经保证,您可以使用Control.BeginInvoke方式(即不用调用EndInvoke),也就是说,不用调用EndInvoke,通常情况下,asynchronous调用并不是这样:通常每个BeginXXX都应该有一个对应的EndXXX调用,通常在callback。“

Invoke()和BeginInvoke()之间有什么区别