WindowsFormsでもよくあるスレッドまたぎでのWindowの呼び出し方法Tips
UIスレッドじゃないところでWindowの生成をするだけで
- $exception {"呼び出しスレッドは、多数の UI コンポーネントが必要としているため、STA である必要があります。"} System.Exception {System.InvalidOperationException}
が発生します。
先に答えを書いちゃうと
var dispatcher = Application.Current.Dispatcher;
if ( dispatcher.CheckAccess())
{
ShowDialogInternal();
}
else
{
dispatcher.Invoke(() => ShowDialogInternal());
}
UIスレッドのDispatcherを取得して、CheckAccessを使ってそのまま呼べるのかInvokeしないといけないのかを判定、実際の処理は再度投げ直すってかんじです。
UIスレッドって書いているにもかかわらず、Dispatcherを取得しているのがアプリケーションメインスレッド(Application.Current.Dispatcher)になってます。
感覚的には以下のようなコードなんですが、
var dispatcher = Application.Current.MainWindow.Dispatcher;
これだと
+ $exception {"このオブジェクトは別のスレッドに所有されているため、呼び出しスレッドはこのオブジェクトにアクセスできません。"} System.Exception {System.InvalidOperationException}
となります。
Application.Current.MainWindowを取得する段階でこけてしまいます。