如何检查当前运行的线程是否在GUI上下文中?
答案 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)