6

私が抱えている問題は次のとおりです。オブジェクトが UI スレッドでインスタンス化されていることを確認する必要があります。そうでない場合は、例外をスローする必要があります。しかし、UI スレッドで実行されているかどうかをメソッド内で確認するにはどうすればよいでしょうか? 注: オブジェクトのコンストラクターに情報を渡したくありません。

完璧な候補は、関連付けられているスレッドを参照する Dispatcher への参照を内部的に保持する DispatcherSynchronizationContext (SynchronizationContext の WPF 実装) ですが、残念ながらそのフィールドはプライベートであるため、アクセスする方法はありません。

4

2 に答える 2

9

通常、UI スレッドは 1 つしかありませんが、多くの UI スレッドが存在する可能性があります。これは、WPF と WinForms の両方に当てはまります。

ただし、これを達成するために私が見つけた最良の方法は、SynchronizationContext を使用することです。WPF と WinForms はどちらも、UI を実行しているスレッドで SynchronizationContext を確立します。これは、特定の UI モデルに縛られていない場合に使用する関数です。

public bool IsPossiblyUIThread() {
  return SynchronizationContext.Current != null;
}

決して確実ではないことに注意してください。非 UI コンポーネントが SynchronizationContext を確立する可能性があり、これは単純なワーカー スレッドに対して true を返します。したがって、権威のない名前。

これを行うためのもう少し信頼できる方法は次のとおりです。ただし、実装するには WPF の少なくとも一部を参照する必要があります。

public bool IsLikelyWpfUIThread() {
  var context = SynchronizationContext.Current;
  return context != null && context is DispatcherSynchronizationContext;
}
于 2009-05-25T16:16:58.443 に答える
2

Dispatcher.CheckAccess()は、コードが Dispatcher と同じスレッドで実行される場合に true を返します。Dispatcher/UIThread が 1 つしかない場合は機能するはずです。

于 2009-05-25T16:18:33.857 に答える