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

重要:本文是以 Microsoft 機器翻譯軟體翻譯而成,而非使用人工翻譯而成。Microsoft 同時提供使用者人工翻譯及機器翻譯兩個版本的文章,讓使用者可以依其使用語言使用知識庫中的所有文章。但是,機器翻譯的文章可能不盡完美。這些文章中也可能出現拼字、語意或文法上的錯誤,就像外國人在使用本國語言時可能發生的錯誤。Microsoft 不為內容的翻譯錯誤或客戶對該內容的使用所產生的任何錯誤或損害負責。Microsoft也同時將不斷地就機器翻譯軟體進行更新。

按一下這裡查看此文章的英文版本:813354
本文已封存。本文係以「現狀」提供且不會再更新。
徵狀
如果您使用 Microsoft.NET Framework 版本 1.0,來建立應用程式,並在應用程式中使用 DateTimePicker 控制項,您可能會發現有記憶體流失的現象發生,當您執行應用程式。
發生的原因
之所以發生這個問題,是因為記憶體回收行程並不會收集無法存取的記憶體。DateTimePicker 控制項都 Microsoft.Win32.UserPreferenceChangedEventHandler 委派與相關聯。當您處置 DateTimePicker 控制項的物件時,在不解除參考這個委派。因此,這個委派防止記憶體回收行程收集 DateTimePicker 控制項物件。
解決方案
如果要解決這個問題,取得最新的 Service Pack,.NET Framework 1.0 的。

若要取得最新的 Service Pack,請造訪下列 Microsoft 網站]:
狀況說明
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) 網站:如需有關 DateTimePicker 類別的詳細資訊,請造訪下列 MSDN 網站:
DateTimePicker 控制記憶體遺漏

警告:本文為自動翻譯

內容

文章識別碼:813354 - 最後檢閱時間:10/26/2013 18:07:04 - 修訂: 1.5

Microsoft .NET Framework 1.0

  • kbnosurvey kbarchive kbmt kbhotfixserver kbqfe kbmemory kbgarbagecollect kbforms kbcode kbbug kbfix kbqfe kbnetframe100presp3fix KB813354 KbMtzh
意見反應