EndInvoke()是可选的,sort-of optional,还是绝对不是可选的?

end*_*ian 56 c# multithreading delegates

我已经阅读了关于每个BeginInvoke()是否必须与EndInvoke()匹配的矛盾意见.是否有任何与调用EndInvoke()相关的泄漏或其他问题?

Mar*_*ell 53

Delegate.EndInvoke被记录为你要调用它(即必要的 - 否则泄漏发生) - 来自msdn:

重要的提示

无论使用哪种技术,始终调用EndInvoke来完成异步调用.

Control.EndInvoke可以忽略fire-and-forget方法 - 来自msdn:

如果需要,可以调用EndInvoke从委托中检索返回值,但这不是必需的.

但是 - 如果您正在使用Delegate.BeginInvoke并且不想要结果,请考虑使用ThreadPool.QueueUserWorkItem- 它会让生活变得更轻松,并避免IAsyncResult等等的痛苦.


Luc*_*tti 18

EndInvoke不是可选的.

更多信息在这里

  • 来自您的链接:"我所知道的规则唯一记录的例外是在Windows窗体中,您可以正式允许调用Control.BeginInvoke而无需调用Control.EndInvoke." (6认同)

Jar*_*Par 9

而且EndInvoke调用不是可选调用,它是合同的一部分.如果调用BeginInvoke,则必须调用EndInvoke.

为什么这是必要的经典例子.从BeginInvoke返回的IAsyncResult很可能已经分配了附加到它的资源.最常见的是WaitHandle.因为IAsyncResult没有实现IDisposable,所以必须选择另一个地方来释放资源.唯一可以这样做的地方是EndInvoke.

我在以下博文中简要讨论了这个问题.

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