2010-12-01 19 views

回答

5

这是不幸的是困难的,因为它并不总是完全是显而易见的是什么构成一个GUI上下文回答与100%的准确率这个问题。它更像是一种启发式而非“是/否”的答案。每种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应用程序虽然)

+0

我知道这是一个古老的答案,但...可以有多个UI线程在一个WPF应用程序,检查使用[Dispatcher.FromThread()](HTTPS当前线程上的活动调度:// MSDN。 microsoft.com/en-us/library/system.windows.threading.dispatcher.fromthread(v=vs.110).aspx)不是一个很好的指标,它是一个(或“该”)UI线程。处理这种情况的最佳方法之一是跟踪启动长时间运行或后台线程的线程的SynchronizationContext,这是异步/等待可能有用的地方(而不是在首次写入此答案时存在)。 – slugster 2017-12-01 10:32:12

1

你问你是否有一个已知的gui对象,你可以查询它,看看你是否在正确的上下文那个对象?我认为guiObject.VerifyAccess()将为此工作。