现有一个非常奇怪的问题,望有哪位达人解答一下,      在一个主窗口中打开一个模式对话框A,再在模式对话框A中新打开另一个模式对话框B,在B的关闭按钮函数中,我调用了this.Dispose(true),希望可以在关闭B后释放资源,但是发生了意想不到的问题,当关闭B的时候,最底层的主窗口会消失掉,最小化到了任务栏中,而只能看到A窗口(一次如果不能重现,多试几次一定会重现的),如果我将那句this.Dispose(true),去掉就不会有这样的问题了,非常困惑,不知道为什么?

解决方案 »

  1.   

    我试了很多次,也没有出现你说的情况,我想问题不是出在Dispose上.看看你的函数里还有什么其他的问题吧!
      

  2.   

    to 51Crack:  我刚刚试过了,即使不加true也会重现这个问题,to GritH2O: 可以这样做个简单的试验,在一个form1中放一个button,button的点击函数是打开一个模式对话框A,在A中也放一个button,点击事件是运行该程序段(  
                 int i = 10000;
                string s = string.Empty;
                while (i > 0)
                {
                    s += "fsajfldjfljsljfdljjsajfdlasj";
                    i--;
                })
    ,以及打开另一个模式对话框B,B中再放一个button,点击函数是:this.Dispose(true);this.close();完成之后,我们运行程序,不断的敲击空格键,重复非常多次后,应该会出现这几个窗口都被最小化到任务栏的现象,我想这个问题应该和垃圾收集很有关系,可就是还没弄明白。
      

  3.   

    你有没有想想this.Dispose();中的this现在指的是谁?
      

  4.   

     to sleep0110: 不清楚你的意思?难道不是模式对话框B吗?望指教
      

  5.   

    我按照你的方法测试了一下,的确出现了你说的现象.
    我感觉问题出在你的循环上.
    你启动了很耗费时间的循环,在循环没有完成的过程中,你不短敲空格键,这个时候
    主进程还在进行循环,操作系统会记录下你敲键盘的动作.循环完成之后才进行操作.
    所以就出现的你说的现象.
    这个现象跟模式窗体,和dispose都没有关系.
    你把中间那个循环另开一个线程就不会出现你说的问题了.
    不知道这样说,能不能帮到你.
      

  6.   

       To GritH2O: 我之所以做这样一个循环来测试,是因为我怀疑是垃圾收集的问题,因为调用this.Dispose(true)的时候,CLR此时可能并没有进行垃圾收集,通过运行这些循环让它产生很多垃圾,使得垃圾收集能发生。我尝试过,如果是将模式对话框B直接通过主窗口打开再关闭是没有问题的(B的关闭函数中依然手动调用了Dispose(true)),这两种情况的区别就在于,模式对话框B是寄宿于主窗口还是寄宿于另一个模式对话框A.
      

  7.   

    应该不会出现楼主说得问题吧,我也试了下,没有任何问题哦 
    如果方便楼主可以把你的代码贴出来看看~private void B_Closing(object sender, System.ComponentModel.CancelEventArgs e)
    {
    try
    {
    this.Close();
    }
    catch 
    {

    }
    finally
    {
    if (this !=null)
    {
    this.Dispose(true);
    }
    }


    }