2010-12-01 37 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()將爲此工作。