只是想知道BeginInvoke()和Invoke()之间的区别是什么?
主要是它们各自的用途。
编辑:创建线程对象和调用调用之间的区别是什么在委托上调用BeginInvoke() ?还是说它们是一样的?
只是想知道BeginInvoke()和Invoke()之间的区别是什么?
主要是它们各自的用途。
编辑:创建线程对象和调用调用之间的区别是什么在委托上调用BeginInvoke() ?还是说它们是一样的?
当前回答
Control.Invoke()和Control.BeginInvoke()之间的区别是,
BeginInvoke()将在GUI线程上调度异步操作。当异步操作被调度时,代码将继续执行。一段时间后(您不知道确切的时间)将执行异步操作 Invoke()将执行异步操作(在GUI线程上)并等待操作完成。
一个合乎逻辑的结论是,传递给Invoke()的委托可以有外参数或返回值,而传递给BeginInvoke()的委托则不能(必须使用EndInvoke来检索结果)。
其他回答
根据Jon Skeet的回答,有时候你想要调用委托,并在当前线程继续之前等待它的执行完成。在这些情况下,Invoke调用就是您想要的。
在多线程应用程序中,您可能不希望线程等待委托完成执行,特别是当委托执行I/O时(这可能会使委托和线程阻塞)。
在这些情况下,BeginInvoke会很有用。通过调用它,你告诉委托开始,然后你的线程可以自由地与委托并行做其他事情。
使用BeginInvoke会增加代码的复杂性,但有时性能的提高是值得的。
delegate . begininvoke()异步地对委托的调用进行排队,并立即返回控制。当使用Delegate.BeginInvoke()时,你应该在回调方法中调用Delegate.EndInvoke()来获得结果。
delegate . invoke()在同一个线程中同步调用委托。
MSDN文章
举个简单的例子,看看它们的差异会产生什么影响
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会在文本更新的同时弹出。如果使用Invoke, MessageBox将在3秒休眠后弹出。因此,显示异步(BeginInvoke)和同步(Invoke)调用的效果。
Control.Invoke()和Control.BeginInvoke()之间的区别是,
BeginInvoke()将在GUI线程上调度异步操作。当异步操作被调度时,代码将继续执行。一段时间后(您不知道确切的时间)将执行异步操作 Invoke()将执行异步操作(在GUI线程上)并等待操作完成。
一个合乎逻辑的结论是,传递给Invoke()的委托可以有外参数或返回值,而传递给BeginInvoke()的委托则不能(必须使用EndInvoke来检索结果)。
只是添加为什么以及何时使用Invoke()。
Invoke()和BeginInvoke()都将您指定的代码封送到调度程序线程。
但与BeginInvoke()不同的是,Invoke()会暂停线程,直到分派器执行你的代码。如果需要暂停异步操作,直到用户提供某种反馈,则可能需要使用Invoke()。
例如,您可以调用Invoke()来运行显示OK/Cancel对话框的代码片段。在用户单击按钮并且您的封送代码完成之后,invoke()方法将返回,您可以根据用户的响应进行操作。
请参阅c#第31章中的Pro WPF