一尘不染

Invoke()和BeginInvoke()有什么区别

c#

只是想知道BeginInvoke()和之间Invoke()有什么区别?

主要是每个人的用途。

编辑:创建线程对象与调用该对象和仅调用BeginInvoke()委托之间有什么区别?还是同一件事?


阅读 264

收藏
2020-05-19

共1个答案

一尘不染

你是说Delegate.Invoke/ BeginInvoke还是Control.Invoke/ BeginInvoke

  • Delegate.Invoke:在同一线程上同步执行。
  • Delegate.BeginInvoke:在threadpool线程上异步执行。
  • Control.Invoke:在UI线程上执行,但是调用线程在继续之前等待完成。
  • Control.BeginInvoke:在UI线程上执行,并且调用线程不等待完成。

蒂姆(Tim)的答案提到了您何时想使用BeginInvoke-尽管Delegate.BeginInvoke我怀疑它主要是针对的。

对于Windows Forms应用程序,建议您 通常 使用BeginInvoke。这样,您就不必担心死锁了-
但是您需要了解,在下次查看UI时可能尚未更新UI!特别是,您不应修改UI线程可能将用于显示目的的数据。例如,如果您具有Personwith
FirstNameLastName属性,并且您执行了以下操作:

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调用。

2020-05-19