REVISIÓN: Se puede observar una pérdida de memoria cuando utiliza el control DateTimePicker en .NET Framework 1.0

Seleccione idioma Seleccione idioma
Id. de artículo: 813354 - Ver los productos a los que se aplica este artículo
Este artículo se ha archivado. Se ofrece "tal cual" y no se volverá a actualizar.
Expandir todo | Contraer todo

En esta página

Síntomas

Si se crea una aplicación mediante Microsoft .NET Framework versión 1.0 y utilizar el control DateTimePicker en la aplicación, puede observar una pérdida de memoria cuando ejecuta la aplicación.

Causa

Este problema se produce porque el recolector de elementos no utilizados no recopila la memoria inaccesible. El control DateTimePicker está asociado con el delegado Microsoft.Win32.UserPreferenceChangedEventHandler . Cuando deshacerse de un objeto del control DateTimePicker , este delegado no se eliminan las referencias. Por lo tanto, este delegado impide que el recolector de elementos no utilizados recopilar el objeto del control DateTimePicker .

Solución

Para resolver este problema, obtenga el service pack más reciente para .NET Framework 1.0.

Para obtener el service pack más reciente, visite el siguiente sitio Web de Microsoft:
http://www.microsoft.com/downloads/details.aspx?familyid=6978D761-4A92-4106-A9BC-83E78D4ABC5B&displaylang=en

Estado

Microsoft ha confirmado que se trata de un problema de los productos de Microsoft enumerados en la sección "La información de este artículo se refiere a:". Este problema se corrigió por primera vez en Microsoft .NET Framework 1.0 Service Pack 3.

Más información

Pasos para reproducir el comportamiento

  1. Crear una aplicación de Microsoft Windows. Para ello, siga estos pasos:
    1. Inicie Microsoft Visual Studio NET..
    2. En el menú archivo , seleccione nuevo y, a continuación, haga clic en proyecto . Aparecerá el cuadro de diálogo nuevo proyecto .
    3. En Tipos de proyecto , haga clic en Proyectos de Visual C# .
    4. En plantillas , haga clic en Aplicación para Windows .
    5. En el cuadro nombre , escriba MyProject y, a continuación, haga clic en Aceptar . De forma predeterminada, se crea un formulario que se denomina Form1.
    6. En el menú Ver , haga clic en cuadro .
    7. Agregue tres controles TextBox al formulario Form1. De forma predeterminada, se crean el control TextBox de textBox1 , el control de TextBox textBox2 y el control TextBox de textBox3 .
    8. Agregue dos controles Button al formulario Form1. De forma predeterminada, se crean el control de botón button1 y el control de botón de button2 .
    9. Agregue el código siguiente al controlador de eventos Form1_Load del formulario Form1.
      GC.Collect();
      GC.WaitForPendingFinalizers();
      long before = GC.GetTotalMemory(true);
      textBox1.Text ="Before test: " + before.ToString();
      el método GC.GetTotalMemory recupera el número de bytes asignados actualmente en la memoria administrada.
    10. En el formulario Form1, haga doble clic en button1 y, a continuación, agregue el código siguiente al controlador de evento Button1_Click del formulario 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. En el formulario Form1, haga doble clic en button2 y, a continuación, agregue el código siguiente al controlador de eventos Button2_Click en el formulario Form1.
      GC.Collect();
      GC.WaitForPendingFinalizers();
      long after = GC.GetTotalMemory(true);
      textBox2.Text = " After Garbage Collection: " + after.ToString();
      el método GC.Collect obliga a la colección de elementos no utilizados e intenta recopilar toda la memoria inaccesible y sin referencia.
    12. En el menú archivo , haga clic en Guardar todo para guardar todos los archivos.
  2. Genere y a continuación, ejecute la aplicación de Windows. Para ello, siga estos pasos:
    1. En el menú Generar , haga clic en Generar soluciones .
    2. En el menú Depurar , haga clic en iniciar . Aparecerá el cuadro de diálogo de Form1. El número de bytes asignados en memoria administrada aparece en el cuadro de texto de textBox1 .
    3. Haga clic en button1 .

      La aplicación crea una instancia del control DateTimePicker en tiempo de ejecución y, a continuación, se deshace del control DateTimePicker . Este comportamiento se produce 100 veces. El número de bytes de memoria administrada después de 100 veces aparece en el cuadro de texto textBox2 . El recolector de elementos no utilizados no recopila las ubicaciones de memoria inaccesible.
    4. Haga clic en button2 .

    El número de bytes que permanecen en memoria administrada después de la aplicación llama al recolector de elementos no utilizados aparecen en el cuadro de texto de textBox2 . Puede observar que la mayoría de los inaccesible memoria aún está en memoria administrada.
Para obtener información adicional, haga clic en el número de artículo siguiente para verlo en Microsoft Knowledge Base:
824684Descripción de la terminología estándar utilizada para describir las actualizaciones de software de Microsoft

Referencias

Para obtener más información sobre el delegado UserPreferenceChangedEventHandler , visite el siguiente Microsoft Developer Network (MSDN) sitio Web:
http://msdn2.microsoft.com/en-us/library/microsoft.win32.userpreferencechangedeventhandler(vs.71).aspx
Para obtener más información acerca de la clase DateTimePicker , visite el siguiente sitio Web de MSDN:
http://msdn2.microsoft.com/en-us/library/system.windows.forms.datetimepicker(vs.71).aspx

Propiedades

Id. de artículo: 813354 - Última revisión: martes, 04 de febrero de 2014 - Versión: 1.5
La información de este artículo se refiere a:
  • Microsoft .NET Framework 1.0
Palabras clave: 
kbnosurvey kbarchive kbmt kbhotfixserver kbqfe kbmemory kbgarbagecollect kbforms kbcode kbbug kbfix kbqfe kbnetframe100presp3fix KB813354 KbMtes
Traducción automática
IMPORTANTE: Este artículo ha sido traducido por un software de traducción automática de Microsoft (http://support.microsoft.com/gp/mtdetails) en lugar de un traductor humano. Microsoft le ofrece artículos traducidos por un traductor humano y artículos traducidos automáticamente para que tenga acceso en su propio idioma a todos los artículos de nuestra base de conocimientos (Knowledge Base). Sin embargo, los artículos traducidos automáticamente pueden contener errores en el vocabulario, la sintaxis o la gramática, como los que un extranjero podría cometer al hablar el idioma. Microsoft no se hace responsable de cualquier imprecisión, error o daño ocasionado por una mala traducción del contenido o como consecuencia de su utilización por nuestros clientes. Microsoft suele actualizar el software de traducción frecuentemente.
Haga clic aquí para ver el artículo original (en inglés): 813354

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