只是想知道BeginInvoke()
和Invoke()
之间的区别是什么?
主要是每个人的用途。
编辑:创建线程对象与调用该对象和仅在委托(delegate)上调用BeginInvoke()
之间有什么区别?还是他们是同一回事?
最佳答案
您是指Delegate.Invoke
/BeginInvoke
还是Control.Invoke
/BeginInvoke
吗?
Delegate.Invoke
:在同一线程上同步执行。 Delegate.BeginInvoke
:在threadpool
线程上异步执行。 Control.Invoke
:在UI线程上执行,但是调用线程在继续之前等待完成。 Control.BeginInvoke
:在UI线程上执行,并且调用线程不等待完成。 蒂姆的答案提到了您可能想使用
BeginInvoke
的时间-尽管我怀疑它主要是针对Delegate.BeginInvoke
的。对于Windows Forms应用程序,我建议您通常应使用
BeginInvoke
。这样,您就不必担心死锁了-但是您需要了解,在下次查看UI时可能尚未更新UI!特别是,您不应修改UI线程可能要用于显示目的的数据。例如,如果您具有具有Person
和FirstName
属性的LastName
,则可以执行以下操作:person.FirstName = "Kevin"; // person is a shared reference
person.LastName = "Spacey";
control.BeginInvoke(UpdateName);
person.FirstName = "Keyser";
person.LastName = "Soze";
然后,UI可能最终会显示“Keyser Spacey”。 (有一个外部机会可能会显示“Kevin Soze”,但只能通过内存模型的怪异来显示。)
但是,除非您遇到此类问题,否则
Control.BeginInvoke
更容易解决,并且可以避免后台线程无缘无故地等待。请注意,Windows Forms团队已保证您可以“即发即弃”的方式使用Control.BeginInvoke
,即无需调用EndInvoke
。通常,异步调用不是这样:通常每个BeginXXX应该在回调中都有一个对应的EndXXX调用。关于c# - Invoke()和BeginInvoke()有什么区别,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/229554/