当我向Dispatcher调用许多方法时,比如UI线程的Dispatcher,
喜欢这里
uiDispatcher.BeginInvoke(new Action(insert_), DispatcherPriority.Normal);
uiDispatcher.BeginInvoke(new Action(add_), DispatcherPriority.Normal);
uiDispatcher.BeginInvoke(new Action(insert_), DispatcherPriority.Normal);
这些方法的执行顺序与我调用它们的顺序相同吗?
答案 0 :(得分:11)
使用Dispatcher
,这些将始终按照调用它们的顺序执行,但仅仅因为DispatcherPriority
是相同的。这是行为保证,并记录在Dispatcher.BeginInvoke:
如果在同一个DispatcherPriority上进行了多次BeginInvoke调用,它们将按照调用的顺序执行。
话虽这么说,通过异步操作,通常最好不要依赖这种行为。如果您将它们称为异步操作,则不应该按照特定顺序计划执行的操作。这有效地在异步操作和调度程序实现之间创建Coupling。
如果订单确实重要,那么通常最好以保证这一点的方式重新设计设计,即使调度机制要改变。例如,使用TPL会更简单,因为您可以安排操作,然后将后续操作安排为第一个任务的延续。
答案 1 :(得分:5)
来自MSDN
如果在同一个DispatcherPriority上进行了多次BeginInvoke调用,它们将按照调用的顺序执行。