首页 新闻 会员 周边 捐助

关于C# winform子窗体初始化影响父窗体的问题

0
悬赏园豆:40 [待解决问题]

在mainForm的“打开子窗体”按钮事件中:
SubForm subForm=new SubForm();
subForm.Show();
在SubForm 的form_load事件中有较为耗费时间的程序执行,比如直接Thread.sleep();
执行到sleep的时候,子窗体死掉,父窗体也死掉。
请问如何解决这个问题呢?主要是如何在这时候让子窗体可以关闭,同时父窗体不死掉。
多谢大虾。

pioneer0724的主页 pioneer0724 | 初学一级 | 园豆:80
提问于:2010-10-13 10:50
< >
分享
所有回答(4)
0

用Show(),而不是ShowDialog()的话,子窗体应该是在另一个线程里运行的,父窗体怎么会死。。会不会是其他原因导致的,能不能详细描述一下。O(∩_∩)O哈哈~

会长 | 园豆:12463 (专家六级) | 2010-10-13 13:39
0

可以试试BackgroundWorker这个控件,位于System.ComponentModel.BackgroundWorker。

wang_yb | 园豆:4893 (老鸟四级) | 2010-10-13 14:16
楼上正解!
支持(0) 反对(0) avenger | 园豆:215 (菜鸟二级) | 2010-10-26 14:47
0

在mainForm的“打开子窗体”按钮事件中:

thread t=new thread(new threadstart(func));

t.start();

 

然后在线程中让窗体show出来

 

private void func()

{

  SubForm subForm=new SubForm();
  subForm.Show();

}

一滴血 | 园豆:1602 (小虾三级) | 2010-10-13 18:26
如果子窗体load时耗时,也在线程中处理。
支持(0) 反对(0) 一滴血 | 园豆:1602 (小虾三级) | 2010-10-13 18:27
0

之所以子窗口和父窗口都会死掉,是因为他们都在同一个线程(界面线程)中,当执行Sleep()时,线程被占用。最好的解决方法就是使用多线程。在窗口程序中,非界面线程不能操作界面控件,如果SubForm的form_load函数中没有涉及到界面控件,则可直接使用多线程,否则需考虑使用BackgroundWorker组件或Invoke或BeginInvoke异步调用方法

avenger | 园豆:215 (菜鸟二级) | 2010-10-26 14:55
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册