我使用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
BeginInvoke
调用Action
您在与Dispatcher
while Invoke
同步调用while 的线程上异步传递给它.
换句话说,Invoke
立即执行Action
你传递给它的任何内容,同时BeginInvoke
将你传递给它的动作放在Dispatcher
队列上,这就像Dispatcher
将要做的事情的列表,但不能保证什么时候会发生或者尽快调度员已经完成了在队列上等待的其他事情.
因此,有时Dispatcher
可能会忙于做其他事情,并将您传递的操作BeginInvoke
放在队列的末尾,直到它可以执行它,然后它Invoke
立即执行您传递给的任何操作,这就是订单差异的原因.