C# 在其他线程关闭窗体,为何不能null
我的意图是将一个窗体作为一个控件,在主窗体显示,在另一Timer线程中关闭,关闭之后为何窗体对象还是不为null
代码如下:
- C# code
//查询 if (w == null) { w = new wait(); w.LabelText = "正在查询,请稍候"; w.TopLevel = false; //将子窗体作为控件显示 w.TopMost = true; w.BringToFront(); w.Location = new System.Drawing.Point(dataGridView.Width / 2 - dataGridView.Location.X - w.Width / 2, dataGridView.Height / 2 - dataGridView.Location.Y);//将子窗体显示在主窗体中间位置, dataGridView.Controls.Add(w);//将子窗体的父容器设置为datagridview w.Show(); }
- C# code
/// <summary> /// 关闭进度窗 /// </summary> void closewait() { if (w != null) { w.Close(); w.Dispose(); this.Focus(); } }
第一次我实例化wait对象后,在Timer里面设置超时事件,时间到了调用closewait关闭窗体,当第二次我想显示wait的时候,if(w==null) 显示w不为null,本来Colse之后肯定会空的么,为什么呢?求解。
[解决办法]
当然不会变成null了,除非你显式设定 w = null。
如你描述的那样,由于在closewait中已经Dispose了w,后续对w的操作将出现异常(ObjectDisposedException)。
[解决办法]
改成这样判断:
- C# code
if (w== null || w.IsDisposed){}