日期:2014-05-17  浏览次数:20863 次

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)
{
}