检查线程是否在Gui上下文中

Rob*_*ert 5 c# wpf

如何检查当前运行的线程是否在GUI上下文中?

Jar*_*Par 5

遗憾的是,很难以100%的准确率回答这个问题,因为构成GUI上下文并不总是很明显.它更像是启发式而非是/否答案.每个GUI框架的启发式都会有所不同.

对于WPF,一个好的方法是检查并查看Dispatcher当前线程是否存在活动状态

public static bool IsWpfGuiThread() {
  return Dispatcher.FromThread(Thread.CurrentThread) != null;
}
Run Code Online (Sandbox Code Playgroud)

然而,这可以通过Dispatcher在随机线程上设置一个但实际上没有在其上放置GUI 来欺骗.

对于WinForms来说,最好检查的是当前的SynchronizationContext.

public static bool IsWinFormsGuiThread() {
  return SynchronizationContext.Current is WindowsFormsSynchronizationContext;
}
Run Code Online (Sandbox Code Playgroud)

然而,这可能被某人暂时(或更长时间)将Current值重置为另一个同步上下文而上当.这基本上只是一个全局线程,可以由任何人设置.在Visual Studio等某些应用程序中进行更改实际上相当常见(但这是一个WPF应用程序)