MS 文档中的此页面,涵盖 Windows 窗体应用程序中的异步,指出:
如果需要,您可以调用 EndInvoke 从委托中检索返回值,但这不是必需的。(重点补充)
该页面涵盖了异步委托的一般情况,陈述了一些不同的内容:
无论您使用哪种技术,始终调用 EndInvoke 来完成您的异步调用。
这两者似乎是直接冲突的。
哪个是真的?有人可以解释吗?
另请参阅Phil Haack 的帖子。
MS 文档中的此页面,涵盖 Windows 窗体应用程序中的异步,指出:
如果需要,您可以调用 EndInvoke 从委托中检索返回值,但这不是必需的。(重点补充)
该页面涵盖了异步委托的一般情况,陈述了一些不同的内容:
无论您使用哪种技术,始终调用 EndInvoke 来完成您的异步调用。
这两者似乎是直接冲突的。
哪个是真的?有人可以解释吗?
另请参阅Phil Haack 的帖子。
除非接口的文档明确说明,否则您必须为每个调用 BeginInvoke 的地方调用 EndInvoke。主要原因是 EndInvoke 是所有者可以安全地释放某些可能分配给 BeginInvoke 调用(例如 WaitHandle)的资源的唯一时间。
但这条规则也有例外。Control.BeginInvoke 等 API 不需要 EndInvoke,但它在文档中是明确的。
两者都是正确的-它们是不同的电话。
通常,您应该始终调用EndInvoke
以确保释放异步调用获取的任何资源。
但是,Windows 窗体团队保证您不需要为Control.Invoke
. 不过,您可能需要为其他实现这样做ISynchronizeInvoke
。
在结果“如果可用时有用,但不是必需的”之前,我已经对委托使用了即发即弃的方法。请记住,使用该方法没有完成保证。特别是,这是我使用它的一个地方:
无论哪种方式,应用程序都会继续不间断。