Invoke()和BeginInvoke()之间的区别是什么?
只是想知道BeginInvoke()
和Invoke()
之间的区别是什么?
主要是每个人会用什么。
编辑:创建一个线程对象和调用调用,并只是调用BeginInvoke()
上的BeginInvoke()
之间有什么区别? 或者他们是同一个东西?
你的意思是Delegate.Invoke / BeginInvoke或Control.Invoke / BeginInvoke?
Tim的回答提到了你可能想要使用BeginInvoke--尽管它主要面向Delegate.BeginInvoke,我怀疑。
对于Windows Forms应用程序,我建议你通常应该使用BeginInvoke。 那样的话,你不需要担心死锁,但是你需要明白,下次你看UI的时候用户界面可能没有被更新! 尤其是,您不应修改UI线程可能用于显示目的的数据。 例如,如果您拥有名字和姓氏属性的人员,并且您执行了以下操作:
person.FirstName = "Kevin"; // person is a shared reference
person.LastName = "Spacey";
control.BeginInvoke(UpdateName);
person.FirstName = "Keyser";
person.LastName = "Soze";
那么用户界面最终可能会显示“Keyser Spacey”。 (外部机会可能会显示“Kevin Soze”,但只能通过内存模型的怪异表现出来。)
但是,除非遇到此类问题,否则Control.BeginInvoke更容易正确使用,并且可以避免后台线程不得不等待无理由。 请注意,Windows窗体小组已确保您可以使用Control.BeginInvoke以“即忘即忘”的方式使用 - 即无需调用EndInvoke。 通常情况下,异步调用并非如此:通常每个BeginXXX都应该有相应的EndXXX调用,通常在回调中。
基于Jon Skeet的回复,有时您想调用委托并等待其执行完成,然后继续执行当前线程。 在这些情况下,Invoke调用就是你想要的。
在多线程应用程序中,您可能不希望线程等待委托来完成执行,特别是如果该委托执行I / O(可以使委托和线程块)。
在这些情况下,BeginInvoke会很有用。 通过调用它,你告诉委托开始,但是你的线程可以自由地与委托并行地做其他事情。
使用BeginInvoke会增加代码的复杂性,但有时候改进的性能值得复杂化。
Control.Invoke()
和Control.BeginInvoke()
之间的区别是,
BeginInvoke()
将在GUI线程上安排异步操作。 当安排异步操作时,代码会继续。 一段时间后(你不知道什么时候)你的异步操作将被执行 Invoke()
将执行您的异步操作(在GUI线程上),并等到操作完成。 一个合乎逻辑的结论是,您传递给Invoke()
的委托可以具有外部参数或返回值,而传递给BeginInvoke()
的委托不能(您必须使用EndInvoke来检索结果)。
上一篇: What's the difference between Invoke() and BeginInvoke()