現在実行中のスレッドがGUIコンテキストにあるかどうかを確認するにはどうすればよいですか?スレッドがGUIコンテキストにあるかどうかをチェック
5
A
答えて
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
オブジェクトをしたいと思います。それはそれはGUIのコンテキストを構成するものは常に完全に明白ではないので、100%の精度で、この質問に答えるために、残念ながら難しいhttp://social.msdn.microsoft.com/forums/en-US/wpf/thread/360540eb-d756-4434-86f9-a3449f05eb55
1
既知のGUIオブジェクトがあるかどうかを確認して、適切なコンテキストであるかどうかを確認できますかそのオブジェクト?私はguiObject.VerifyAccess()
がこれのために働くと思う。
私は、これは古い答えですけど、... [Dispatcher.FromThread()](httpsを使用して、現在のスレッドでアクティブなディスパッチャをチェックし、WPFのアプリで複数のUIスレッドがあることができます:// MSDNを。 microsoft.com/en-us/library/system.windows.threading.dispatcher.fromthread(v=vs.110).aspx)は、UIスレッドであることを示す良い指標ではありません。これを処理する最善の方法の1つは、長い実行スレッドまたはバックグラウンドスレッドを開始するスレッドのSynchronizationContextを追跡することです。これは非同期/待機が役に立ちます(この回答が最初に書き込まれたときに存在していたものではありません)。 – slugster