熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

從小處看C#.net垃圾回收

2013-11-13 10:07:10  來源: .NET編程 
    如果不用MDI來實現一個主窗體打開多個子窗體時
  
  從一個窗體(主窗體)打開一個(only one) 另外一個的窗體(子窗體)的實現
  
父窗體MainForm
  
  public partial class MainForm:Form
  
  {
  
  
  
  
  
   private void menuItem_Load(object senderEventArgs e)
  
   {
  
   ChildForm child=ChildFormCreate();
  
   childshow();
  
   childFocus();
  
   }
  
  
  
   //
  
  }
  
  
  
子窗體ChildForm
  
  
  
  public partial class ChildForm:Form
  
  {
  
  
  
  
  
   static ChildForm child;
  
  
  
   Public static ChildForm Create()
  
   {
  
   if(child==null)
  
   child=new ChildForm();
  
   return Child;
  
   }
  
  
  
  }
  
  
  
  F運行後的確實現了上面提到的功能然而把子窗體關閉後想再次打開該子窗體時單擊菜單項會出現異常ObjectDisposedException was unhandled
  
  
  
這是為什麼呢??
  
  
  
  這裡涉及到C#垃圾回收的問題
  
  
  
  垃圾回收是NET運行庫的一部分垃圾回收器管理所有的托管對象所有需要托管數據的NET語言(包括 C#)都受運行庫的垃圾回收器的制約垃圾回收器可以確定運行垃圾回收的最佳時間自動進行垃圾回收然而垃圾回收的一個產物是C# 對象沒有確定性毀壞所以會出現對象child已被銷毀但又不為null訪問時產生ObjectDisposedException異常
  
  
  
怎麼辦??
  
  
  
   方法應該徹底回收Child所占的資源
  
   途徑有二
  
方法一
  
  修改子窗體的構造函數
  
  public ChildForm()
  
  {
  
   //
  
   thisDisposed+=new SystemEventHandler(Form_Disposed)
  
  }
  
  然後事件Form_Disposed的處理函數
  
  private void Form_Disposed(object senderEventArgs e)
  
  {
  
   Child=null;
  
  }
  
方法二
  
  重寫ChildForm的OnClosed方法
  
  Protected void OnClosed(EventArgs e)
  
  {
  
  
   baseOnClosed(e);
   child=null;
  
  }
  
  當然可能有其他的方法各位看客有興趣的話補充一下另外有敘述不當的地方請多多指教在下感激不盡
  

From:http://tw.wingwit.com/Article/program/net/201311/12609.html
    相關文章
      没有相关文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.