在系统运行中,如果有多个线程正在运行,并且不影响主线程的运行情况下,如果需要打开一个Dialog,设置一些参数,保存并关闭,但是,会发现,在主窗体中的线程如果没有结束前是无法关闭弹出的对话框的.下面是错误和正确的两种方法:
一.传统错误的方法
- private void ConfigToolStripMenuItem_Click(object sender, EventArgs e)
- {
- //直接弹出创建的对话框
- MyDialog dlg = new MyDialog();
- dlg.ShowDialog(this);
- dlg.Dispose();
- }
这种方法,在调试中可以发现,虽然弹出的对话窗体中的代码有运行,但是,在多线程运行结束前,是不会运行的dlg.Dispose();这行代码上的.所以窗体是无法关闭的.当然,我也试过在子窗体代码中使用this.Close();来关闭,也是不行的.
二.使用线程委托弹出对话框
- private void ConfigToolStripMenuItem_Click(object sender, EventArgs e)
- {
- //线程运行Dialog方法进行委托
- Thread ShowDialog = new Thread(Dialog);
- //这行代码一定要有,否则第二次运行就会出错,关闭不了对话框
- ShowDialog.IsBackground = true;
- ShowDialog.Start();
- }
- //委托弹出对话框
- delegate void ThreadDialog();
- //判断是否需要进行委托运行方法
- private void Dialog()
- {
- //显示配置对话框
- if (this.InvokeRequired)
- this.Invoke(new ThreadDialog(Dialog));
- else
- {
- //执行委托的代码
- MyDialog dlg = new MyDialog();
- dlg.ShowDialog(this);
- dlg.Dispose();
- }
- }
小结
这样在运行委托的时候就可以正常的关闭对话框了.对话框中的代码也是可以运行的.在多线程的程序中,界面的操作遇到的问题比较复杂,一般是使用与其他线程并行的线程委托进行.
在多线程中还存在一个问题,子窗口中如果访问了,一些公共数据,发生阻塞时,也是无法正常关闭窗口的,只能等待互斥的释放了.