您好, 我正在用 C# 开发一些应用程序。目前我正在处理线程,我有一个问题在我的脑海中。 Invoke 和 BeginInvoke 有什么区别? 我阅读了一些主题并在这里找到了一些有用的信息:here
但是下面代码中Invoke和BeginInvoke的区别是什么:
private void ProcessRoutine()
{
for (int nValue = StartFrom; nValue <= EndTo; nValue++)
{
this.Invoke(this.MyDelegate, nValue);
//this.BeginInvoke(this.MyDelegate, nValue);
}
MessageBox.Show("Counting complete!");
}
private void MessageHandler(int progress)
{
lblStatus.Text = lblStatus.Text = "Processing item: " + progress.ToString();
progressBar1.Value = progress;
}
其中 MyDelegate 是对 MessageHandler 函数的引用。
我注意到在使用 Invoke 刷新标签时,使用 BeginInvoke lblStatus.Text 不会刷新。 此外,我知道 Invoke 等待其执行完成。 我感兴趣的最重要的案例是为什么在这种情况下刷新标签文本会有所不同。
最佳答案
首先,从您的链接开始:
Control.Invoke
:在 UI 线程上执行,但调用线程在继续之前等待完成。Control.BeginInvoke
:在异步UI线程上执行,调用线程不等待完成。
来自 MSDN:
BeginInvoke executes the specified delegate asynchronously on the thread that the control's underlying handle was created on.
总而言之,BeginInvoke
是异步的。当从 UI 线程调用 BeginInvoke
时,请求将与 UI 线程并行执行。这意味着在当前执行的方法返回之前它可能不会执行。所以在这种情况下,文本框永远不会出现更新,因为 for 循环不会被中断,因为调用线程不会等待此事件完成后再继续。
或者,Invoke
是同步的。文本框将被更新,因为调用线程将在继续执行之前等待调用完成。
关于c# - 调用和开始调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1909839/