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

时间:2010-12-01 01:33:11

标签: c# wpf

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

3 个答案:

答案 0 :(得分:5)

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

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

public static bool IsWpfGuiThread() {
  return Dispatcher.FromThread(Thread.CurrentThread) != null;
}

然而,这可以通过在随机线程上设置Dispatcher但实际上没有在其上放置GUI来愚弄。

对于WinForms,要检查的是当前的SynchronizationContext

public static bool IsWinFormsGuiThread() {
  return SynchronizationContext.Current is WindowsFormsSynchronizationContext;
}

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

答案 1 :(得分:1)

您是否询问是否有已知的gui对象可以查询它以查看您是否处于该对象的正确上下文中?我认为guiObject.VerifyAccess()将适用于此。

答案 2 :(得分:0)