web-dev-qa-db-ja.com

別のスレッドからform.show()を呼び出すC#

別のスレッドから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
}
19
sczdavos

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 が役立つ場合があります。

13
Hiroshi Maekawa

私の経験による最良の方法:

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();
0
Mohamad Taheri