当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《EndInvoke()是可选的,sort-ofoptional,还是绝对不是可选的?》经验,为你挑选了3个好方法。

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



1> Marc Gravell..:

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

重要的提示

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

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

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

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



2> Luca Martine..:

EndInvoke不是可选的.

更多信息在这里


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

3> JaredPar..:

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

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

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

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

推荐阅读
郑小蒜9299_941611_G
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有