FIX: 您可能會發現有記憶體流失的現象發生,當您在.NET Framework 1.0 中使用 DateTimePicker 控制項

文章翻譯 文章翻譯
文章編號: 813354 - 檢視此文章適用的產品。
本文已封存。本文係以「現狀」提供且不會再更新。
全部展開 | 全部摺疊

在此頁中

徵狀

如果您使用 Microsoft.NET Framework 版本 1.0,來建立應用程式,並在應用程式中使用 DateTimePicker 控制項,您可能會發現有記憶體流失的現象發生,當您執行應用程式。

發生的原因

之所以發生這個問題,是因為記憶體回收行程並不會收集無法存取的記憶體。DateTimePicker 控制項都 Microsoft.Win32.UserPreferenceChangedEventHandler 委派與相關聯。當您處置 DateTimePicker 控制項的物件時,在不解除參考這個委派。因此,這個委派防止記憶體回收行程收集 DateTimePicker 控制項物件。

解決方案

如果要解決這個問題,取得最新的 Service Pack,.NET Framework 1.0 的。

若要取得最新的 Service Pack,請造訪下列 Microsoft 網站]:
http://www.microsoft.com/downloads/details.aspx?familyid=6978D761-4A92-4106-A9BC-83E78D4ABC5B&displaylang=en

狀況說明

Microsoft 已確認<適用於>一節所列之 Microsoft 產品確實有此問題。 這個問題已經在 Microsoft 中第一次獲得修正.NET Framework 1.0 Service Pack 3。

其他相關資訊

重現這個問題的步驟

  1. 建立 Microsoft Windows 應用程式。要這麼做,請您執行下列步驟:
    1. 啟動 Microsoft Visual Studio.NET。
    2. 在 [檔案] 功能表上指向 [新增],然後按一下 [專案]。出現 [新增專案] 對話方塊。
    3. 在 [專案類型 下, 按一下 [Visual C# 專案]。
    4. 在 [範本,] 下按一下 [Windows 應用程式]。
    5. 在 [名稱] 方塊中輸入 MyProject,],然後再按一下 [確定]]。預設情況下,會建立名為 Form1 的表單。
    6. 按一下 [檢視] 功能表 工具箱
    7. 將三個 文字方塊 控制項加入至 Form1 表單。預設情況下,會建立 [textBox1TextBox 控制項、 textBox2TextBox 控制項及 textBox3TextBox 控制項]。
    8. 將兩個 按鈕 控制項加入至 Form1 表單。預設情況下,會建立 button1Button 控制項及 button2Button 控制項。
    9. 將下列程式碼加入至 Form1_Load 事件處理常式的
      GC.Collect();
      GC.WaitForPendingFinalizers();
      long before = GC.GetTotalMemory(true);
      textBox1.Text ="Before test: " + before.ToString();
      GC.GetTotalMemory 方法會擷取目前配置在 Managed 記憶體中的位元組數。 Form1 表單。
    10. Form1] 表單上連按兩下 button1,然後將下列程式碼加入至 button1_Click 事件處理常式的 Form1 表單
      long after;
      for (int i=0; i<100; i++) 
      {
      DateTimePicker dtp=new DateTimePicker();	
      dtp.Dispose();
      dtp=null;
      }
      after = GC.GetTotalMemory(true);
      textBox2.Text = " After test: " + after.ToString();
    11. Form1] 表單上連按兩下 button2,然後將下列程式碼加入至 button2_Click 事件處理常式在
      GC.Collect();
      GC.WaitForPendingFinalizers();
      long after = GC.GetTotalMemory(true);
      textBox2.Text = " After Garbage Collection: " + after.ToString();
      GC.Collect 方法會強制記憶體回收集合,並且嘗試收集所有無法存取及 dereferenced 記憶體。 Form1 表單。
    12. 在 [檔案] 功能表上按一下 [另 儲存全部 儲存所有檔案新檔]。
  2. 建置並執行 Windows 應用程式。要這麼做,請您執行下列步驟:
    1. 在 [建置] 功能表上按一下 建置方案
    2. 在 [偵錯] 功能表上按一下 [開始]。[Form1] 對話方塊隨即出現。textBox1] 文字方塊中,顯示在 Managed 記憶體中配置的位元組數目。
    3. 按一下 button1

      應用程式在執行階段建立 DateTimePicker 控制項的執行個體,並再處置 DateTimePicker 控制項。這個問題的發生原因,是 100 倍。textBox2] 文字方塊中,顯示 100 的項目之後的 Managed 記憶體中的位元組數目。記憶體回收行程並不會收集無法存取的記憶體位置。
    4. 按一下 button2

    應用程式會呼叫記憶體回收行程後仍會保留在 Managed 記憶體中的位元組數目顯示在 textBox2] 文字方塊。您可能會注意到的無法存取該大部分記憶體仍處於受管理記憶體。
如需詳細資訊按一下下面的文件編號檢視將在 「 Microsoft 知識庫 」 文件在下列文件:
824684標準術語的用到描述 Microsoft 軟體更新的描述

?考

如需有關 UserPreferenceChangedEventHandler 委派的詳細資訊,請造訪下列 Microsoft 開發 o 人 h 員 ? 工 u 具 ? 網路 (MSDN) 網站:
http://msdn2.microsoft.com/en-us/library/microsoft.win32.userpreferencechangedeventhandler(vs.71).aspx
如需有關 DateTimePicker 類別的詳細資訊,請造訪下列 MSDN 網站:
http://msdn2.microsoft.com/en-us/library/system.windows.forms.datetimepicker(vs.71).aspx

屬性

文章編號: 813354 - 上次校閱: 2013年10月26日 - 版次: 1.5
這篇文章中的資訊適用於:
  • Microsoft .NET Framework 1.0
關鍵字:?
kbnosurvey kbarchive kbmt kbhotfixserver kbqfe kbmemory kbgarbagecollect kbforms kbcode kbbug kbfix kbqfe kbnetframe100presp3fix KB813354 KbMtzh
機器翻譯
重要:本文是以 Microsoft 機器翻譯軟體翻譯而成,而非使用人工翻譯而成。Microsoft 同時提供使用者人工翻譯及機器翻譯兩個版本的文章,讓使用者可以依其使用語言使用知識庫中的所有文章。但是,機器翻譯的文章可能不盡完美。這些文章中也可能出現拼字、語意或文法上的錯誤,就像外國人在使用本國語言時可能發生的錯誤。Microsoft 不為內容的翻譯錯誤或客戶對該內容的使用所產生的任何錯誤或損害負責。Microsoft也同時將不斷地就機器翻譯軟體進行更新。
按一下這裡查看此文章的英文版本:813354
Microsoft及(或)其供應商不就任何在本伺服器上發表的文字資料及其相關圖表資訊的恰當性作任何承諾。所有文字資料及其相關圖表均以「現狀」供應,不負任何擔保責任。Microsoft及(或)其供應商謹此聲明,不負任何對與此資訊有關之擔保責任,包括關於適售性、適用於某一特定用途、權利或不侵權的明示或默示擔保責任。Microsoft及(或)其供應商無論如何不對因或與使用本伺服器上資訊或與資訊的實行有關而引起的契約、過失或其他侵權行為之訴訟中的特別的、間接的、衍生性的損害或任何因使用而喪失所導致的之損害、資料或利潤負任何責任。

提供意見

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com