[C#]在线程运行过程中关闭子对话框

在系统运行中,如果有多个线程正在运行,并且不影响主线程的运行情况下,如果需要打开一个Dialog,设置一些参数,保存并关闭,但是,会发现,在主窗体中的线程如果没有结束前是无法关闭弹出的对话框的.下面是错误和正确的两种方法:

一.传统错误的方法

  1. private void ConfigToolStripMenuItem_Click(object sender, EventArgs e)
  2. {
  3.     //直接弹出创建的对话框
  4.     MyDialog dlg = new MyDialog();
  5.     dlg.ShowDialog(this);
  6.     dlg.Dispose();    
  7. }

这种方法,在调试中可以发现,虽然弹出的对话窗体中的代码有运行,但是,在多线程运行结束前,是不会运行的dlg.Dispose();这行代码上的.所以窗体是无法关闭的.当然,我也试过在子窗体代码中使用this.Close();来关闭,也是不行的.

 

二.使用线程委托弹出对话框

  1. private void ConfigToolStripMenuItem_Click(object sender, EventArgs e)
  2. {
  3.     //线程运行Dialog方法进行委托
  4.     Thread ShowDialog = new Thread(Dialog);
  5.     //这行代码一定要有,否则第二次运行就会出错,关闭不了对话框
  6.     ShowDialog.IsBackground = true;
  7.     ShowDialog.Start();            
  8. }
  9. //委托弹出对话框
  10. delegate void ThreadDialog();
  11. //判断是否需要进行委托运行方法
  12. private void Dialog()
  13. {
  14.    //显示配置对话框
  15.    if (this.InvokeRequired)
  16.       this.Invoke(new ThreadDialog(Dialog));
  17.    else
  18.    {
  19.       //执行委托的代码
  20.       MyDialog dlg = new MyDialog();
  21.       dlg.ShowDialog(this);
  22.       dlg.Dispose();
  23.    }
  24. }

小结

这样在运行委托的时候就可以正常的关闭对话框了.对话框中的代码也是可以运行的.在多线程的程序中,界面的操作遇到的问题比较复杂,一般是使用与其他线程并行的线程委托进行.

在多线程中还存在一个问题,子窗口中如果访问了,一些公共数据,发生阻塞时,也是无法正常关闭窗口的,只能等待互斥的释放了.

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值