別スレッドで画面を開くことで、そのフォームがモーダル画面を開いているときでも呼び出し元画面の操作を行うことが可能になる。
注意点として、フォームを表示するスレッドにはSTAThread属性を設定しないと、保存ダイアログの表示など特定の処理でエラーが発生してしまう。
また別スレッドを作成する際、キャッチされなかったエラーイベント「Application.ThreadException」「Thread.GetDomain().UnhandledException」の設定が必要であれば忘れないようにする。
サンプルコード
using System.Threading;
…
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void btnShowModalDialog_Click(object sender, EventArgs e)
{
// 別スレッド表示した画面でモーダルダイアログ表示中でも、呼び出し元画面の操作が可能
MessageBox.Show("test");
}
private void btnOpenNewWindow_Click(object sender, EventArgs e)
{
// 別スレッドでフォームを表示する
// C#4.0以降で追加されたTaskは、STAThreadを設定できないので使えない
Thread thread = new Thread(() =>
{
// 必要なら、キャッチされなかったエラーイベント設定
// Application.ThreadException += new ThreadExceptionEventHandler(Application_ThreadException);
// Thread.GetDomain().UnhandledException += new UnhandledExceptionEventHandler(GetDomain_UnhandledException);
(new Form1()).ShowDialog();
});
thread.IsBackground = true; // 親スレッド(例えばメニュー画面)の終了時に同時に終了する
thread.SetApartmentState(ApartmentState.STA); // 保存ダイアログ等を利用したとき問題が出ないよう、STA属性を指定
thread.Start();
}
}