2010-12-01 4 views

答えて

5

参照してください。はい/いいえの答えよりもヒューリスティックです。ヒューリスティックは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

私は、これは古い答えですけど、... [Dispatcher.FromThread()](httpsを使用して、現在のスレッドでアクティブなディスパッチャをチェックし、WPFのアプリで複数のUIスレッドがあることができます:// MSDNを。 microsoft.com/en-us/library/system.windows.threading.dispatcher.fromthread(v=vs.110).aspx)は、UIスレッドであることを示す良い指標ではありません。これを処理する最善の方法の1つは、長い実行スレッドまたはバックグラウンドスレッドを開始するスレッドのSynchronizationContextを追跡することです。これは非同期/待機が役に立ちます(この回答が最初に書き込まれたときに存在していたものではありません)。 – slugster

1

既知のGUIオブジェクトがあるかどうかを確認して、適切なコンテキストであるかどうかを確認できますかそのオブジェクト?私はguiObject.VerifyAccess()がこれのために働くと思う。