线程不能从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上放置一个Timer
,它将在窗口打开后2秒关闭窗口。工具箱上的图标看起来像一个秒表。在属性窗口中,设置Interval=2000
和Enabled=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中我只是关闭表单