线程无法从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();
}
答案 0 :(得分:3)
编辑:
最好在Form2上放置一个Timer
,它会在打开后2秒关闭窗口。工具箱上的图标看起来像秒表。在属性窗口中,设置Interval=2000
和Enabled=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控件的方法或属性。