Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 异步调用-是否需要EndInvoke?_C#_Multithreading_Delegates_Begininvoke - Fatal编程技术网

C# 异步调用-是否需要EndInvoke?

C# 异步调用-是否需要EndInvoke?,c#,multithreading,delegates,begininvoke,C#,Multithreading,Delegates,Begininvoke,可能的重复项: 我有一个多线程应用程序,其中一个次要线程需要获得一些代码,以便每隔几分钟在主线程上执行一次。没有任何返回值,第二个线程不关心是否引发任何异常或无法运行 到目前为止,我一直在让它通过Form.Invoke运行代码,但有时需要比平时更长的时间(几秒钟)并阻塞线程,直到它完成。我需要第二个线程能够在不暂停几秒钟的情况下继续执行 BeginInvoke听起来似乎可以很好地完成这项工作,但我实在没有地方调用EndInvoke,因为我不想等待它或获取返回值。考虑到被调用的代码涉及一系列本

可能的重复项:

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

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

BeginInvoke
听起来似乎可以很好地完成这项工作,但我实在没有地方调用
EndInvoke
,因为我不想等待它或获取返回值。考虑到被调用的代码涉及一系列本机调用,我不确定不
EndInvoke
是否是个好主意

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


谢谢=)

您应该确保调用了EndInvoke,但您可以非常轻松地完成这项工作,例如:

  var action = new Action(SomeMethodGroup); 

  action.BeginInvoke(new AsyncCallback(

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

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

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


来源:在备注下

我认为OP是在谈论Form.BeginInvoke,而不是Begin/EndInvoke模式。查看MSDN,Form.BeginInvoke似乎并不完全遵循Begin/EndInvoke模式。@dtb,事实上,我不认为Form.BeginInvoke或Delegate.BeginInvoke严格需要它,因为我认为它只会在尝试等待(即调用EndInvoke)时创建WaitHandle。WaitHandle需要清理,但如果你调用了EndInvoke,那就更好了。好的方面是,也许你不需要EndInvoke,也许是一个简单的方法,可以作为“开火并忘记”策略使用?太棒了,所以我可以将我的
Invoke
s更改为
BeginInvoke
s,而不必炸掉任何东西。