异步调用方法的执行顺序

时间:2012-06-08 17:09:37

标签: c# multithreading invoke dispatcher begininvoke

当我向Dispatcher调用许多方法时,比如UI线程的Dispatcher,

喜欢这里

uiDispatcher.BeginInvoke(new Action(insert_), DispatcherPriority.Normal);
uiDispatcher.BeginInvoke(new Action(add_), DispatcherPriority.Normal);
uiDispatcher.BeginInvoke(new Action(insert_), DispatcherPriority.Normal);

这些方法的执行顺序与我调用它们的顺序相同吗?

2 个答案:

答案 0 :(得分:11)

使用Dispatcher,这些将始终按照调用它们的顺序执行,但仅仅因为DispatcherPriority是相同的。这是行为保证,并记录在Dispatcher.BeginInvoke

  

如果在同一个DispatcherPriority上进行了多次BeginInvoke调用,它们将按照调用的顺序执行。

话虽这么说,通过异步操作,通常最好不要依赖这种行为。如果您将它们称为异步操作,则不应该按照特定顺序计划执行的操作。这有效地在异步操作和调度程序实现之间创建Coupling

如果订单确实重要,那么通常最好以保证这一点的方式重新设计设计,即使调度机制要改变。例如,使用TPL会更简单,因为您可以安排操作,然后将后续操作安排为第一个任务的延续。

答案 1 :(得分:5)

来自MSDN

  

如果在同一个DispatcherPriority上进行了多次BeginInvoke调用,它们将按照调用的顺序执行。