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,而不必炸掉任何东西。