异步调用方法的执行顺序

mar*_*man 5 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);
Run Code Online (Sandbox Code Playgroud)

这些方法是否会以我调用它们的顺序执行?

Ree*_*sey 11

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

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

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

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

  • 删除我的答案,因为我错过了一些重要的*错误*.这是正确的答案. (3认同)

ReP*_*rre 5

来自MSDN

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