c# - 调用和开始调用

标签 c# asynchronous invoke begininvoke

您好, 我正在用 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/

相关文章:

ios - 如何异步加载和更新 UITableView 的几个部分?

Python 日志记录开销

c# - 使用 Stream.BeginRead 的顺序异步读取

java - 如何从主类 java 调用另一个类中的方法

c# - 如果字符串在 C# 中包含 2 个句点

c# - 为什么我不能在需要父类列表的函数中引用子类列表?

c# - Entity Framework - 如何避免查询重新编译?

c# - 重新排序序列的最简单方法

java - 使用反射调用字段上的方法

c# - 从 __ComObject 获取可调用方法