异步调用 - 是否需要 EndInvoke?

发布于 2024-11-17 17:23:29 字数 798 浏览 3 评论 0原文

可能的重复:
每个 BeginInvoke 后面都必须跟一个 EndInvoke 吗?
EndInvoke() 是可选的、排序可选的还是绝对不是可选的?

我有一个多线程应用程序,其中一个辅助线程需要每隔几分钟在主线程上执行一次一些代码。没有任何返回值,第二个线程不关心它是否引发任何异常或运行失败。

到目前为止,我已经让它通过 Form.Invoke 运行代码,但有时需要比平常更长的时间(几秒钟)并阻塞线程直到完成。我需要第二个线程能够继续执行而不会停止几秒钟。

BeginInvoke 听起来好像它可以很好地完成这项工作,但我真的没有地方可以调用 EndInvoke,因为我不想等待它或得到一个返回值。考虑到被调用的代码涉及大量本机调用,我不确定不使用 EndInvoke 是否是一个好主意。

我是否需要调用 EndInvoke ,或者是否有其他方法可以让我应该使用的代码在主表单线程上异步运行?

谢谢=)

Possible Duplicates:
Must every BeginInvoke be followed by an EndInvoke?
Is EndInvoke() optional, sort-of optional, or definitely not optional?

I've got a multithreaded application, and one of the secondary threads needs to get some code to execute on the main thread once every couple of minutes. There isn't any return value, and the second thread doesn't care if it raises any exceptions or fails to run.

So far, I've been getting it to run the code via Form.Invoke, but it sometimes takes much longer than usual (a couple of seconds) and blocks the thread until it completes. I need the second thread to be able to continue execution without stalling for several seconds.

BeginInvoke sounds like it'd do the job nicely, but I don't really have anywhere to call EndInvoke, since I don't want to wait for it or get a return value. And considering that the code being invoked involves a bunch of native calls, I'm not sure if its a good idea to not EndInvoke.

Do I need to call EndInvoke at all, or is there some other way of getting code to run on the main form thread asyncronously that I should be using instead?

Thanks =)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

紫轩蝶泪 2024-11-24 17:23:29

如果需要,您可以调用 EndInvoke 从委托检索返回值,如果需要,但这不是必需的。EndInvoke 将阻塞,直到可以检索返回值为止。

来源:http://msdn.microsoft.com/en-us/library/0b1bf3y3.aspx 备注下

You can call EndInvoke to retrieve the return value from the delegate, if neccesary, but this is not required. EndInvoke will block until the return value can be retrieved.

Source:http://msdn.microsoft.com/en-us/library/0b1bf3y3.aspx under Remarks

鸢与 2024-11-24 17:23:29

调用 EndInvoke 的一种典型方法是在 BeginInvoke 中包含完成回调,以便您可以在回调中调用 EndInvoke。这对于执行比 Invoke 更具体操作的 Begin/End 方法更为重要,例如 BeginRead/EndRead;在后一种情况下,可能需要 End 来进行清理,并且通常还会(重新)抛出该过程中发生的任何异常。

One typical way to call EndInvoke is by including a completion callback with the BeginInvoke so that you can call EndInvoke in the callback. This is more important for Begin/End methods that do something more specific than Invoke, such as BeginRead/EndRead; in the latter cases, the End may be required for cleanup and will also typically (re)throw any Exception that occurred during the process.

笑咖 2024-11-24 17:23:29

您应该确保调用 EndInvoke,但您可以很容易地做到这一点,例如:

  var action = new Action(SomeMethodGroup); 

  action.BeginInvoke(new AsyncCallback(

        x => (x.AsyncState as Action).EndInvoke(x)), action); 

You should ensure that EndInvoke is called, but you can do it pretty easily, something like:

  var action = new Action(SomeMethodGroup); 

  action.BeginInvoke(new AsyncCallback(

        x => (x.AsyncState as Action).EndInvoke(x)), action); 
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文