複数UIスレッドを作ったときに、つらい思いをしたパターンの情報共有です。
結論を3行で
- UIスレッドを複数作ることは二度とないです
- 絶対にUIスレッドは複数作りません
- UIスレッドはMainスレッドだけです
前書き
ほぼ「複数 UI スレッドを WPF でやる前にやってほしいこと」の話です。アプリケーションの要件的に、参照先の記事に書いてある問題点は関係ないので、ちょっと試してみようかなと。
だいたい、MS Docsで紹介されている由緒正しい方法ですしね。
なにが起きたか
-
Application.Windows
を参照しただけで落ちました。サードパーティライブラリの中で参照していたので割とどうしようもない。挙動としては納得。 -
Application.ShutdownMode
がほとんど役に立たない。OnLastWindowClose
に設定しても、Mainスレッドから表示したWindowがすべてCloseした段階でアプリケーションが終了する。そこしか監視していないんだろうなあ。
どうしたか
UIスレッドをMainスレッドに一本化しました。そこらへんのロジックを集約していたのが吉と出て、全体への影響はほとんどなし。
万一、複数UIスレッドを作りたい人がいたら
単一UIスレッドに戻せるような仕組みにはしておいたほうがいいと思います。問題が起きてから切り戻せるなら、複数UIスレッドもありだと思います。
ただ、どこで問題が起きるかわからない地雷原みたいな手法なので、私はもう二度とやりません。
終わりに
チートシートみたいに、この問題が起きないことがわかっているなら複数UIスレッドも悪くないよ、というリストが作れたらいいですね。
私は二度とUIスレッドを複数作らないので、新しい問題を発見することはないでしょうが。
参考記事
- 複数 UI スレッドを WPF でやる前にやってほしいこと https://qiita.com/okazuki/items/698ec4d45c8286fedac1
- スレッド モデル https://docs.microsoft.com/ja-jp/dotnet/desktop/wpf/advanced/threading-model?view=netframeworkdesktop-4.8