110,534
社区成员
发帖
与我相关
我的任务
分享
Action run=()=>{FormTest frm=new FormTest();frm.ShowDialog();};
run.BeginInvoke(null,null);
看不懂什么叫做“让线程不被释放”,这里在纠结什么?你的 frm2 变量为什么不声明在 btnTest_Click 外边?怎么成为 btnTest_Click 的局部变量? 在子线程中操作控件不是不可以,但是你必须保证不存在多线程胡乱——冲突地——操作界面,才能避免产生难以调试的bug。所以一般来说使用“主线程”来操作所有界面控件也是这个道理。并不是说,用不同的线程操作操作不同的控件本身就没有问题,但是一般人根本做不到准确地用不同线程操作不同控件,而且也没有必要,所以才统一用一个UI线程。 换句话说,也就是,你操作主线程的流程有严重的设计bug,然后用更加诡异更加纠结的东西来“圆谎”来缓解矛盾,这其实是恶性循环。正确的方式当然还是把你的主线程流程问题解决好。
把你代码发上来看看,简化过的最好
[quote=引用 5 楼 sj490790083 的回复:] 我试了加了While(true),情况一样,能看到任务栏有个窗体,但是点不出来
private void btnTest_Click(object sender,EventArgs e)
{
int _i=0;
Action run=()=>
{
Form2 frm2=new Form2();
frm2.Show();
while(true)
{
i++;
}
}
run.BeginInvoke(null,null);
}
我试了加了While(true),情况一样,能看到任务栏有个窗体,但是点不出来
[quote=引用 3 楼 sj490790083 的回复:] 我用不是MessageBox的方式让线程不被释放,比如加个定时器,但还是不显示啊
我用不是MessageBox的方式让线程不被释放,比如加个定时器,但还是不显示啊
线程执行完毕后,线程内资源都释放了,不是无法显示,而是一闪而过,你在form里加个messagebox就能看到