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. 创建一个 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 站点:
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
机器翻译
注意:这篇文章是由无人工介入的微软自动的机器翻译软件翻译完成。微软很高兴能同时提供给您由人工翻译的和由机器翻译的文章, 以使您能使用您的语言访问所有的知识库文章。然而由机器翻译的文章并不总是完美的。它可能存在词汇,语法或文法的问题,就像是一个外国人在说中文时总是可能犯这样的错误。虽然我们经常升级机器翻译软件以提高翻译质量,但是我们不保证机器翻译的正确度,也不对由于内容的误译或者客户对它的错误使用所引起的任何直接的, 或间接的可能的问题负责。
点击这里察看该文章的英文版: 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