只是想知道BeginInvoke()
和Invoke()
之间的区别是什么?
主要是每个人将用于什么。
编辑:创建线程对象和调用它的调用之间的区别是什么,只是在委托上调用BeginInvoke()
?或者它们是一样的吗?
答案 0 :(得分:533)
您的意思是Delegate.Invoke / BeginInvoke还是Control.Invoke / BeginInvoke?
对于Windows窗体应用程序,我建议您通常使用BeginInvoke。这样你就不必担心死锁了 - 但是你需要明白,在你下次看它时,UI可能还没有更新!特别是,您不应该修改UI线程可能用于显示目的的数据。例如,如果您有一个具有FirstName和LastName属性的Person,那么您执行了:
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窗体团队已经保证您可以以“即发即忘”的方式使用Control.BeginInvoke - 即无需调用EndInvoke。对于异步调用一般情况并非如此:通常每个BeginXXX都应该有相应的EndXXX调用,通常在回调中。
答案 1 :(得分:42)
在Jon Skeet的回复基础上,有时您想要调用委托并等待其执行在当前线程继续之前完成。在这些情况下,Invoke调用就是你想要的。
在多线程应用程序中,您可能不希望线程等待委托完成执行,特别是如果该委托执行I / O(这可能会使委托和您的线程阻塞)。
在这些情况下,BeginInvoke会很有用。通过调用它,你告诉委托开始,然后你的线程可以自由地与委托并行做其他事情。
使用BeginInvoke会增加代码的复杂性,但有时候改进的性能值得复杂。
答案 2 :(得分:23)
Control.Invoke()
和Control.BeginInvoke()
之间的区别是,
BeginInvoke()
将在GUI线程上安排异步操作。安排异步操作后,代码将继续。一段时间后(您不确切知道何时)将执行您的异步操作Invoke()
将执行您的异步操作(在GUI线程上)并等待您的操作完成。一个合乎逻辑的结论是,传递给Invoke()
的委托可以有out-parameters或return-value,而传递给BeginInvoke()
的委托则不能(你必须使用EndInvoke来检索结果)。
答案 3 :(得分:14)
只是举一个简短的,有效的例子来看看他们差异的影响
new Thread(foo).Start();
private void foo()
{
this.Dispatcher.BeginInvoke(DispatcherPriority.Normal,
(ThreadStart)delegate()
{
myTextBox.Text = "bing";
Thread.Sleep(TimeSpan.FromSeconds(3));
});
MessageBox.Show("done");
}
如果使用 BeginInvoke ,MessageBox会同时弹出文本更新。如果使用调用,MessageBox会在3秒睡眠后弹出。因此,显示异步( BeginInvoke )和同步( Invoke )调用的效果。
答案 4 :(得分:8)
Delegate.BeginInvoke()以异步方式对委托的调用进行排队,并立即返回控件。使用Delegate.BeginInvoke()时,应该在回调方法中调用Delegate.EndInvoke()来获取结果。
Delegate.Invoke()在同一个线程中同步调用委托。
答案 5 :(得分:6)
只需添加使用Invoke()的原因和时间。
Invoke()和BeginInvoke()将您指定的代码编组到调度程序线程。
但与BeginInvoke()不同,Invoke()会停止您的线程,直到调度程序执行您的代码。 如果您需要暂停异步操作,直到用户提供某种反馈,您可能希望使用Invoke()。
例如,您可以调用Invoke()来运行显示“确定/取消”对话框的代码片段。在用户单击按钮并且您的编组代码完成后,invoke()方法将返回,您可以根据用户的响应进行操作。
参见C#第31章中的Pro WPF