线程不能从form2退出

本文关键字:退出 form2 不能 线程 | 更新日期: 2023-09-27 18:02:07

线程无法从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();
}

线程不能从form2退出

编辑:

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

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

原始回答:

对于初学者来说,你通常不能把system.windows.forms的东西和工作线程混在一起。你需要使用UI的"message loop"线程。

另一个问题是,直到您关闭第一个窗口(因为.ShowDialog() . 6),线程才启动。工作线程新建一个表单(但从不显示它),然后关闭它(但它没有打开),所以它永远不会出现。

这是你的意思吗?

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();
    }

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

看一下如何:使线程安全调用Windows窗体控件

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

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

让我知道你的具体要求是什么。正如本文前面提到的,允许工作线程访问UI元素不是一个好主意

这就是我要做的

private void button1_Click(对象发送者,EventArgs e){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的方法,在Form2中我只是关闭表单