线程不能从form2退出

时间:2011-07-13 00:45:02

标签: c# winforms multithreading

线程无法从form2退出

private void button1_Click(object sender, EventArgs e)
{
    ThreadStart myThreadDelegate = new ThreadStart(RunExitForm2);
    Form2 f2 = new Form2();
    Thread MyThread = new Thread(myThreadDelegate);
    f2.ShowDialog();
    MyThread.Start();

}
private void RunExitForm2()
{
    Form2 f2 = new Form2();
    f2.Close();
}

4 个答案:

答案 0 :(得分:3)

编辑:

最好在Form2上放置一个Timer,它会在打开后2秒关闭窗口。工具箱上的图标看起来像秒表。在属性窗口中,设置Interval=2000Enabled=True,然后订阅Tick事件并说出this.Close();

void timer1_Tick(object sender, EventArgs ea)
{
   this.Close ();
}

原始答案:

对于初学者来说,你通常不能用system.windows.forms填充工作线程。您需要使用UI“消息循环”线程。

另一个问题是,在你关闭第一个窗口之前不会启动线程(因为.ShowDialog()。工作线程新闻一个表单(但从未显示),然后关闭它(但它是不开放),所以它永远不会出现。

答案 1 :(得分:0)

这就像你的意思吗?

private void button1_Click(object sender, EventArgs e)
    {
        Form2 frmTest = new Form2();

        System.Threading.ThreadPool.QueueUserWorkItem(f =>
        {
            // easy to see the effect...
            System.Threading.Thread.Sleep(1000);

            Form2 me = f as Form2;
            this.BeginInvoke(new Action(() => {
                me.Close();
            }));

        }, frmTest);

        frmTest.ShowDialog();
    }

答案 2 :(得分:0)

查看您正在创建两个Form2实例的代码,同时尝试关闭您创建一个新实例。

还有一点,即使你只有一个实例,你在主线程上创建一个表单并尝试在不同的工作线程上关闭它,你将得到跨线程异常。

让我知道你的要求到底是什么。正如本文前面提到的,允许工作线程访问UI元素

并不是一个好主意

这就是我要做的事情

private void button1_Click(object sender,EventArgs e)         {             ThreadStart myThreadDelegate = new ThreadStart(RunExitForm2);

        Thread MyThread = new Thread(myThreadDelegate);
        MyThread.Start();
        f2.ShowDialog(Application.OpenForms[0]);



    }

    private void RunExitForm2()
    {
        Thread.Sleep(10000);

       test t = new test(f2.CloseForm2);


        if (InvokeRequired)
        {
            BeginInvoke( t);
            return;
        }

    }

这里test是委托给Form2中定义的Closeform2的方法,其中我只关闭表单

答案 3 :(得分:0)

您永远不应该从第二个线程调用UI控件的方法或属性。

查看How to: Make Thread-Safe Calls to Windows Forms Controls