只是想知道BeginInvoke()和之间Invoke()有什么区别?
BeginInvoke()
Invoke()
主要是每个人的用途。
编辑:创建线程对象与调用该对象和仅调用BeginInvoke()委托之间有什么区别?还是同一件事?
你是说Delegate.Invoke/ BeginInvoke还是Control.Invoke/ BeginInvoke?
Delegate.Invoke
BeginInvoke
Control.Invoke
Delegate.BeginInvoke
threadpool
Control.BeginInvoke
蒂姆(Tim)的答案提到了您何时想使用BeginInvoke-尽管Delegate.BeginInvoke我怀疑它主要是针对的。
对于Windows Forms应用程序,建议您 通常 使用BeginInvoke。这样,您就不必担心死锁了- 但是您需要了解,在下次查看UI时可能尚未更新UI!特别是,您不应修改UI线程可能将用于显示目的的数据。例如,如果您具有Personwith FirstName和LastName属性,并且您执行了以下操作:
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调用。
EndInvoke