我已经阅读了关于每个BeginInvoke()是否必须与EndInvoke()匹配的矛盾意见.是否有任何与调用EndInvoke()相关的泄漏或其他问题?
Delegate.EndInvoke被记录为你要调用它(即必要的 - 否则泄漏发生) - 来自msdn:
重要的提示
无论使用哪种技术,始终调用EndInvoke来完成异步调用.
Control.EndInvoke可以忽略fire-and-forget方法 - 来自msdn:
如果需要,可以调用EndInvoke从委托中检索返回值,但这不是必需的.
但是 - 如果您正在使用Delegate.BeginInvoke
并且不想要结果,请考虑使用ThreadPool.QueueUserWorkItem
- 它会让生活变得更轻松,并避免IAsyncResult
等等的痛苦.
EndInvoke不是可选的.
更多信息在这里
而且EndInvoke调用不是可选调用,它是合同的一部分.如果调用BeginInvoke,则必须调用EndInvoke.
为什么这是必要的经典例子.从BeginInvoke返回的IAsyncResult很可能已经分配了附加到它的资源.最常见的是WaitHandle.因为IAsyncResult没有实现IDisposable,所以必须选择另一个地方来释放资源.唯一可以这样做的地方是EndInvoke.
我在以下博文中简要讨论了这个问题.
http://blogs.msdn.com/jaredpar/archive/2008/01/07/isynchronizeinvoke-now.aspx