6

可能的重复:
每个 BeginInvoke 必须跟 EndInvoke 吗?
EndInvoke() 是可选的,是可选的,还是绝对不是可选的?

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

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

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

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

谢谢 =)

4

3 回答 3

6

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

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

于 2011-06-30T05:16:15.973 回答
4

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

于 2011-06-30T05:04:15.320 回答
3

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

  var action = new Action(SomeMethodGroup); 

  action.BeginInvoke(new AsyncCallback(

        x => (x.AsyncState as Action).EndInvoke(x)), action); 
于 2011-06-30T05:03:38.937 回答