Una aplicación de consola que se basa en un STA puede retrasar el lanzamiento de los componentes COM y puede retrasar las llamadas a los métodos Finalize de los objetos que el recolector de elementos no utilizados recoge

Seleccione idioma Seleccione idioma
Id. de artículo: 828988 - Ver los productos a los que se aplica este artículo
Expandir todo | Contraer todo

Síntomas

Si una aplicación de consola que se basa en un apartamento de un único subproceso (STA) crea y, a continuación, utiliza componentes de modelo STA de objetos componentes (COM) y la aplicación de consola no realiza operaciones suficientes para suministrar mensajes de COM, como llamar al método de Monitor.Enter , el método Thread.Join y otros, pueden producirse los síntomas siguientes. Además, si la aplicación de consola realiza las operaciones que se ejecutan durante un largo período de tiempo y que no bombeo de mensajes, como una llamada al método Console.ReadLine , pueden producirse los síntomas siguientes:
  • La versión de componentes COM puede retardarse.
  • Las llamadas a los métodos Finalize de los objetos que el recolector de elementos no utilizados recoge pueden retardarse.
  • Llamadas a componentes COM pueden bloquear el subproceso de aplicación durante períodos prolongados.
  • Puede aumentar la cantidad de memoria que utiliza el proceso de la aplicación STA a lo largo del tiempo.
  • Las llamadas al método GC.WaitForPendingFinalizers pueden tardar mucho para devolver.

Causa

Para entregar una llamada a un componente COM STA correctamente, incluida una llamada para liberar el componente, el subproceso donde se creó el componente debe ser bombean mensajes. Cuando el código administrado ya no hace referencia a un componente de COM, el subproceso del finalizador debe llamar al método Release del componente. Sin embargo, si el subproceso STA donde se creó el componente no bombea mensajes, la llamada se bloquea la aplicación hasta que el subproceso comienza bombean mensajes de nuevo. Algunas aplicaciones crean mucha de componentes COM y objetos que pueden finalizarse. En estas aplicaciones, si el subproceso del finalizador dedica mucho de tiempo bloqueado mientras se espera el STA subproceso bombeo de mensajes, es posible que el subproceso del finalizador no podrá completar su actividad. Tanto la lista de COM componentes para la versión y la lista de objetos administrados a finalize pueden crecer indefinidamente. Si se produce este problema, puede aumentar la cantidad de memoria que utiliza el proceso de la aplicación STA a lo largo del tiempo. Además, cualquier subproceso que llama al método GC.WaitForPendingFinalizers puede bloquearse indefinidamente.

Las operaciones de (es) de entrada y salida de archivo y la consola del sistema operativo, como ReadFile y WriteFile , no bombeo de mensajes. Puesto Console.ReadLine depende de la API de ReadFile del sistema operativo, Console.ReadLine no o no de bombeo de mensajes. Por lo tanto, cualquier subproceso que llama a Console.ReadLine no suministrar mensajes durante la llamada.

Solución

Para resolver este problema, utilice subprocesos MTA en lugar de subprocesos STA para crear y comunicarse con componentes COM en aplicaciones de consola. Puede establecer el subproceso principal de la aplicación a un MTA. Para ello, aplique el System.MTAThread atributo para el método main, como sigue:
public class ConsoleApplication
             {
                 [MTAThread]
                 static void Main()
                 {
                     // Add your code here.
                     Console.ReadLine();
                 }
} 
si debe utiliza subprocesos STA para crear componentes COM, los subprocesos STA deben suministrar mensajes regularmente. Para suministrar mensajes durante un breve período de tiempo, llame al método Thread.Join , como sigue:
Thread.CurrentThread.Join(100)
esta llamada a método pumps mensajes para 100 milisegundos. Puede ajustar el tiempo de espera según los requisitos de la aplicación. Además, el STA subproceso no debe realizar nunca unbounded operaciones no bombea, tales como llamar a Console.ReadLine . En su lugar, el subproceso STA debe tener un subproceso MTA realizar la operación y, a continuación, espere a que termine la operación.

Referencias


Para obtener más información acerca de Microsoft .NET Framework remoting, visite el siguiente sitio Web de Microsoft:
http://msdn2.microsoft.com/en-us/library/1912sb9w(vs.71).aspx
Para obtener más información acerca de la recolección en .NET Framework, visite los siguientes sitios Web de Microsoft:
http://msdn.microsoft.com/msdnmag/issues/1100/gci/
http://msdn.microsoft.com/msdnmag/issues/1200/GCI2/

Para obtener información adicional acerca del bloqueo llamadas desde un componente STA, haga clic en el número de artículo siguiente para verlo en Microsoft Knowledge Base:
291837INFORMACIÓN: No realizar llamadas de bloqueo de un componente STA

Propiedades

Id. de artículo: 828988 - Última revisión: lunes, 09 de febrero de 2004 - Versión: 1.4
La información de este artículo se refiere a:
  • Microsoft .NET Framework 1.1
  • Microsoft .NET Framework 1.0
Palabras clave: 
kbmt kbgarbagecollect kbremoting kbprb KB828988 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): 828988

Enviar comentarios

 

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