异步调用 - 是否需要EndInvoke?

时间:2011-06-30 04:56:11

标签: c# multithreading delegates begininvoke

  

可能重复:
  Must every BeginInvoke be followed by an EndInvoke?
  Is EndInvoke() optional, sort-of optional, or definitely not optional?

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

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

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

我是否需要完全调用EndInvoke,或者是否有其他方法让代码在主窗体线程上运行异步,而不是我应该使用?

谢谢=)

3 个答案:

答案 0 :(得分:6)

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

来源:备注

下的http://msdn.microsoft.com/en-us/library/0b1bf3y3.aspx

答案 1 :(得分:4)

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

答案 2 :(得分:3)

您应该确保调用EndInvoke,但是您可以非常轻松地执行此操作,例如:

  var action = new Action(SomeMethodGroup); 

  action.BeginInvoke(new AsyncCallback(

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