C# 多线程new form的问题

来源:百度知道 编辑:UC知道 时间:2024/06/25 21:05:22
有两个窗体.
form1:
public Form1()
{
InitializeComponent();
}

private void Form1_Load(object sender, EventArgs e)
{
Thread t = new Thread(new ThreadStart(a));
t.Start();
}
public void a()
{
new Form2();
}

form2 的构造方法里面加了一句 this.show();

问题来了,为什么这样做的话,form2打开就自动被关了. 如果不用多线程的话,直接在f1的formload里面写new form2(), form2就不会被关闭. 这是为什么.该怎么解决?
我问的是多线程的问题.

在form1里面启动一个新的线程来 new form2 , form2一被new出来就会被自动关闭,这是为什么.

答案是:Show不是阻塞的.

比如现在有线程函数:
void ThreadProc()
{
Form2 form2 = new Form2();
...
}
进入Form2的构造之后,会把form2给Show出来,但是由于Show不阻塞,所以构造走完之后,线程会继续执行后面的...的代码.一直到这个线程函数走完.一旦线程函数走完之后,form2的生命周期就结束了,所以form2会被释放掉,所以自动关闭了.
把Show改成ShowDialog就不会出现这个情况,因为ShowDialog会进入form2的消息循环,直到form2关闭了,线程才会走到...这里的代码.

一般做法:
在form2初始化时,实例化form1
form1不关闭 form2不show

像你那样 你可以 让form1.Hide();

你的线程定义不应该写在form1里面,而应该写在主函数里面

恩,如三楼所说的,线程执行完毕,生命周期结束,自动调用析构函数