C# Dispatcher Invoke 和正常的代码执行顺序

问题描述

我对 dispatcher.Invoke 的具体工作原理有些怀疑。这更像是一个理论问题(我没有任何以这种方式编写的代码)。

假设我有这个代码

Application.Current.dispatcher.Invoke( () => func1() );
func2();
Application.Current.dispatcher.Invoke( () => func3() );
func4();

据我了解,func1() 保证在 func3() 之前执行。 (以及 func2() 之前的 func4())。 但是被调用函数(1 和 3)与普通函数(2 和 4)之间的关系是什么?

由于调用函数是在它们的线程上执行的,所以我认为实际上没有关系:例如,func1() 可能在 func2() 之前或之后执行,这取决于线程的可用性。 但我想 func3() 将始终在 func2()后执行,因为它是在它之后启动的。 我还认为某些函数可能在不同的线程上重叠执行。

这是正确的吗?还是我理解错了?

解决方法

根据documentation

Invoke 是同步操作;因此,直到回调返回后,控制才会返回到调用对象。

因此,示例中的 func1()func2()func3()func4() 方法将完全按照此顺序、顺序且没有重叠地调用。