別のスレッドからWinFormsオブジェクトでform.show()
を呼び出すと、フォームは例外をスローします。メインのアプリスレッドに新しい表示可能なフォームを追加する方法はありますか?それ以外の場合、現在実行中のスレッドを停止せずにフォームを開くにはどうすればよいですか?
これが私のサンプルコードです。スレッドを開始し、そのスレッド内でいくつかの作業を実行しようとしています。作業が進むにつれて、フォームを表示します。
public void Main()
{
new Thread(new ThreadStart(showForm)).Start();
// Rest of main thread goes here...
}
public void showForm()
{
// Do some work here.
myForm form = new myForm();
form.Text = "my text";
form.Show();
// Do some more work here
}
Application.Run()
を呼び出した後、form.Show()
を呼び出す必要があります。例えば:
public void showForm()
{
// Do some work here.
myForm form = new myForm();
form.Text = "my text";
form.Show();
Application.Run();
// Do some more work here
}
理由の詳細については、 this msdn post が役立つ場合があります。
私の経験による最良の方法:
var ac = (ReportPre)Application.OpenForms["ReportPre"];
Thread shower = new Thread(new ThreadStart(() =>
{
if (ac == null)
{
this.Invoke((MethodInvoker)delegate () {
ac = new ReportPre();
ac.Show();
});
}
else
{
this.Invoke((MethodInvoker)delegate
{
pictureBox1.Visible = true;
});
if (ac.InvokeRequired)
{
ac.Invoke(new MethodInvoker(delegate {
ac.Hide();
ac.Show();
}));
}
}
}));
shower.Start();