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

Posted

技术标签:

【中文标题】C# Dispatcher Invoke 和正常代码执行顺序【英文标题】:C# Dispatcher Invoke and normal code execution order 【发布时间】:2021-04-14 04:29:58 【问题描述】:

我对@9​​87654321@ 究竟是如何工作的有一些疑问。这更像是一个理论问题(我没有用这种方式编写的任何代码)。

假设我有这个代码:

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

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

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

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

【问题讨论】:

【参考方案1】:

根据documentation:

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

因此,您示例中的func1()func2()func3()func4() 方法将按此顺序调用,顺序且不重叠。

【讨论】:

以上是关于C# Dispatcher Invoke 和正常代码执行顺序的主要内容,如果未能解决你的问题,请参考以下文章

C# 多线程 Invoke BeginInvoke

等待 Dispatcher.InvokeAsync 与 Dispatcher.Invoke

如何将 UI 与 C# 中的渲染分开?

Application.Current.Dispatcher.BeginInvoke(action) VS。 Application.Current.Dispatcher.Invoke(action)

dispatcher invoke 会导致主程序闪退吗

使用 Dispatcher.Invoke 从非主线程更改 WPF 控件