可能重复:
Must every BeginInvoke be followed by an EndInvoke?
Is EndInvoke() optional, sort-of optional, or definitely not optional?
我有一个多线程应用程序,其中一个辅助线程需要每隔几分钟就在主线程上执行一些代码。没有任何返回值,第二个线程不关心它是否引发任何异常或无法运行。
到目前为止,我一直在通过Form.Invoke
运行代码,但它有时需要比平常更长的时间(几秒钟)并阻塞线程直到完成。我需要第二个线程才能继续执行而不会停顿几秒钟。
BeginInvoke
听起来好像做得很好,但我真的没有任何地方可以调用EndInvoke
,因为我不想等待它或获得返回值。考虑到被调用的代码涉及一堆本机调用,我不确定不是EndInvoke
是一个好主意。
我是否需要完全调用EndInvoke
,或者是否有其他方法让代码在主窗体线程上运行异步,而不是我应该使用?
谢谢=)
答案 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);