我正在使用 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/