每个BeginInvoke必须跟一个EndInvoke吗?

Che*_*eso 25 .net multithreading begininvoke

MS文档中的此页面,包括Windows窗体应用程序中的异步,指出:

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

这个页面涵盖了异步委托的一般情况,说明了一些不同的东西:

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

这两者似乎存在直接冲突.

这是真的吗?谁能解释一下?

另见Phil Haack的帖子.

相关:EndInvoke是可选的,sort-of optional,绝对不是可选的?

Jar*_*Par 22

除非接口的文档明确说明,否则必须为每个调用BeginInvoke的地方调用EndInvoke.主要原因是EndInvoke是所有者可以安全地释放可能为BeginInvoke调用分配的某些资源(例如WaitHandle)的唯一时间.

但这条规则有例外.诸如Control.BeginInvoke之类的API不需要EndInvoke,但它在文档中是明确的.


Jon*_*eet 13

两者都是真的 - 他们是不同的电话.

通常,您应始终调用EndInvoke以确保释放异步调用获取的任何资源.

但是,Windows窗体团队保证您不需要这样做Control.Invoke.您可能需要为其他实现执行此操作ISynchronizeInvoke.

  • @Cheeso:不 - Control.BeginInvoke根本就不是*委托*的调用*.*需要*代表. (3认同)