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 网站:
状态
Microsoft 已经确认这是在"适用于"一节中列出的 Microsoft 产品中的问题。 此问题已被首先更正 microsoft.net Framework 1.0 Service Pack 3。
更多信息

重现行为的步骤

  1. 创建一个 Windows 应用程序。若要这样做,请按照下列步骤操作:
    1. 启动 Microsoft Visual Studio.net。
    2. 文件 菜单上指向 新建,然后单击 项目。在 新建项目 对话框。
    3. 项目类型 框中,单击 Visual C# 项目
    4. 模板 框中,单击 Windows 应用程序
    5. 名称 框中键入 MyProject,然后单击 确定。默认状态下,创建名为 Form1 的窗体。
    6. 视图 菜单上单击 工具箱
    7. 将三个 文本框 控件添加到 Form1 窗体。默认状态下,创建 textBox1TextBox 控件、 textBox2文本框 控件和 textBox3TextBox 控件。
    8. 将两个 按钮 控件添加到 Form1 窗体。默认状态下,创建 button1按钮 控件和 button2Button 控件。
    9. 将下面的代码添加到 Form1 窗体。 Form1_Load 事件处理程序
      GC.Collect();GC.WaitForPendingFinalizers();long before = GC.GetTotalMemory(true);textBox1.Text ="Before test: " + before.ToString();
      GC.GetTotalMemory 方法检索当前在托管内存中分配的字节数。
    10. Form1 窗体上双击 button1,然后将下面的代码添加到 Form1 窗体的 button1_Click 事件处理程序
      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 方法强制垃圾回收,尝试收集所有无法访问和取消引用的内存。 Form1 窗体中。
    12. 文件 菜单上单击 全部保存 以保存所有文件。
  2. 生成,然后运行 Windows 应用程序。若要这样做,请按照下列步骤操作:
    1. 生成 菜单上单击 生成解决方案
    2. 调试 菜单上单击 开始。在 Form1 对话框。textBox1 文本框中,将出现在托管内存中分配的字节数。
    3. 单击 button1

      应用程序运行时创建 DateTimePicker 控件的实例,然后释放 DateTimePicker 控件。出现此问题的 100 倍。textBox2 文本框中显示的 100 的匹配项之后的托管内存中的字节数。垃圾回收器不会收集无法访问的内存位置。
    4. 单击 button2

    textBox2 文本框中显示的应用程序调用垃圾回收器后,在托管内存中保留的字节数。您可能会注意到,大部分将无法访问内存仍处于托管内存。
有关更多的信息请单击下面的文章编号,查看在在 Microsoft 知识库文章:
824684用于描述 Microsoft 软件更新的标准术语的说明
参考
有关 UserPreferenceChangedEventHandler 委托的详细信息,请访问以下 Microsoft 开发人员网络 (MSDN) 的 Web 站点:DateTimePicker 类有关的详细信息,请访问下面的 MSDN 网站:
DateTimePicker 控件内存泄漏

属性

文章 ID: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
反馈