時々ハングする ac# winforms アプリがあり、メインの GUI スレッドからウィンドウを開いていないことを確認する必要があると言われました。Spy++ を起動したところ、クライアント セッションの開始時に OpenFileDialog を開くと、コード パスがメインの GUI スレッドで実行されているにもかかわらず、そのダイアログが別のスレッドに存在することに気付きました。
次に、ウィンドウが閉じられた後も、ウィンドウはワーカー スレッド上にあるものとして Spy++ に表示されます。これは、OpenFileDialog の使用を using ステートメントで囲んだ場合でも発生します。そのため、ダイアログを破棄しても、実際にはウィンドウが取り除かれないようです。これは奇妙です。
実際のコードはこちら
if (filename == String.Empty)
{
using (var openFileDialog = new OpenFileDialog
{
Filter = string.Format(MessageStrings["DialogFormat"]),
Title = MessageStrings["OpenDialogTitle"]
})
{
if (openFileDialog.ShowDialog() != DialogResult.OK || openFileDialog.FileName == String.Empty)
return false;
filename = openFileDialog.FileName;
}
}