25

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

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

该页面涵盖了异步委托的一般情况,陈述了一些不同的内容:

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

这两者似乎是直接冲突的。

哪个是真的?有人可以解释吗?

另请参阅Phil Haack 的帖子

相关:EndInvoke 是可选的,是可选的,绝对不是可选的吗?

4

3 回答 3

23

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

但这条规则也有例外。Control.BeginInvoke 等 API 不需要 EndInvoke,但它在文档中是明确的。

于 2009-08-13T20:09:46.617 回答
14

两者都是正确的-它们是不同的电话。

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

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

于 2009-08-13T20:09:31.420 回答
1

在结果“如果可用时有用,但不是必需的”之前,我已经对委托使用了即发即弃的方法。请记住,使用该方法没有完成保证。特别是,这是我使用它的一个地方:

  • 启动委托以检查应用程序更新
  • 委托开始一个超时的网络请求
  • 如果发生错误/超时,或者应用程序是最新的,则该方法简单地返回
  • 如果应用程序已过期,我会放置一条非焦点窃取系统托盘消息,说明如此(除非更新可用,否则没有系统托盘图标)

无论哪种方式,应用程序都会继续不间断。

于 2009-08-13T20:13:08.713 回答