c# - Control.Dispatcher.BeginInvoke() 和 Control.Dispatcher.Invoke() 顺序执行是不是很困惑?

标签 c# wpf

我正在使用 WPF,我对 Control.Dispatcher.BeginInvoke()Control.Dispatcher.Invoke() 的执行顺序感到困惑。

我将在下面展示一个代码示例

backgroundThread = new Thread(BackgroundThread);
backgroundThread.Start();
public void BackgroundThread()
{
    this.Dispatcher.BeginInvoke(new Action(delegate()
    {
      WriteLog("Run command 1");
    }));

    this.Dispatcher.Invoke(new Action(delegate()
    {
      WriteLog("Run command 2");
    }));
}

我预计“命令 1”将在“命令 2”之前运行并完成,但有时似乎“命令 2”在“命令 1”之前运行。我在互联网和 MSDN 文档上进行了很多研究,但我不明白为什么会这样。

谁能告诉我这些函数的具体规则?

非常感谢!

大同

最佳答案

BeginInvoke 在与 Dispatcher 关联的线程上异步调用您传递给它的 Action > 同步调用该操作。

换句话说,Invoke 立即执行您传递给它的所有Action,而BeginInvoke 将您传递给它的操作放在Dispatcher 队列,它类似于 Dispatcher 将要做的事情的列表,但不能保证什么时候会发生或调度程序何时完成其他事情等待那个队列的东西。

所以有时 Dispatcher 可能忙于做其他事情,并将您传递给 BeginInvoke 的操作放在队列的末端,直到它可以执行它,然后它执行任何您立即传递给 Invoke 的操作,这就是顺序差异的原因。

关于c# - Control.Dispatcher.BeginInvoke() 和 Control.Dispatcher.Invoke() 顺序执行是不是很困惑?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18032059/

相关文章:

c# - 如何在 C# 中使用 T 类型进行类型转换并访问其属性和变量

c# - GetAllWithChildren() 性能问题

wpf - 如何在不破坏自动化测试的情况下为 TabControl 定义 ControlTemplate?

c# - 单击停止调试按钮后有什么方法可以运行事件?由 C# WPF

wpf - 在 WPF 用户控件中绑定(bind)到路由事件的命令

c# - Activator.CreateInstance 和标准构造函数有什么区别?

c# - 需要完全合格的类型名称

c# - 在 C# 中将 Excel 范围作为文本数组或单元格格式的快速方法?

c# - NullReferenceException 未处理 - 如何解决它

c# - 为什么我不能在 xaml 中定义网格模板?