c# – Control.Dispatcher.BeginInvoke()和Control.Dispatcher.Invoke()订单执行令人困惑?

我正在使用 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文档进行了很多研究,但我不明白为什么会这样.

有人请告诉我这些功能的规则究竟是什么?

非常感谢!

T& T公司

解决方法

在Invoke同步调用该操作时,BeginInvoke在与dispatcher关联的线程上异步调用您传递给它的Action.

换句话说,Invoke会立即执行您传递给它的Action,而BeginInvoke会将您传递给它的操作放在dispatcher队列中,这就像dispatcher将要执行的操作列表一样,但不能保证何时进行发生或一旦调度员完成其他事情等待该队列.

因此,有时dispatcher可能正在忙于执行其他操作并将您传递给BeginInvoke的操作放在队列的末尾,直到它可以执行它,然后它会立即执行您传递给Invoke的任何操作,这就是订单差异的原因.

相关文章

C#项目进行IIS部署过程中报错及其一般解决方案_c#iis执行语句...
微信扫码登录PC端网站应用的案例(C#)_c# 微信扫码登录
原文地址:http://msdn.microsoft.com/en-us/magazine/cc163...
前言 随着近些年微服务的流行,有越来越多的开发者和团队所采...
最近因为比较忙,好久没有写博客了,这篇主要给大家分享一下...
在多核CPU在今天和不久的将来,计算机将拥有更多的内核,Mic...