2010-12-13 20 views
5

Si tengo un hilo STA en .NET, y creo un objeto STA COM en ese hilo, y luego el hilo termina, ¿mata esa instancia del objeto?COM Interop .NET STA

¿Tengo entendido que a los objetos STA COM se puede acceder mediante varios subprocesos y el tiempo de ejecución calculará automáticamente las llamadas para que todo suceda en la cadena de apartamentos? ¿Es eso hilo el hilo que ha creado la instancia? Entonces, si ese hilo termina, ¿la instancia queda huérfana y se pierde? ¿O hay un hilo separado creado para las instancias de STA?
¿Cómo funciona esto en ASP.Net con ASPCompat = True? Según entiendo, cada solicitud se maneja mediante un hilo de trabajo aleatorio, y si mi componente STA se coloca en la sesión, ¿se eliminará aleatoriamente porque el hilo del procesador de solicitud que lo creó podría haber finalizado?

Respuesta

5

Si crea su objeto STA COM en un hilo .NET STA, todas las llamadas a su objeto se agrupan en ese hilo.

Si crea su objeto STA COM en un hilo .NET MTA, el tiempo de ejecución creará un hilo STA y gestionará todas las llamadas a ese hilo.

Entonces, cuando su hilo (STA) existe, sus objetos COM son inaccesibles.

Una solución podría ser crear objetos en un nuevo hilo para el que pueda controlar la duración.

he hecho una cosa similar así:

using (ManualResetEventSlim mre = new ManualResetEventSlim(false)) 
{ 
    Thread _STAThread = new Thread(new ThreadStart(() => 
       { 
        globalComObject = new ComClass(); 
        mre.Set(); 
        try 
        { 
         Thread.CurrentThread.Join(); 
        } 
        catch (ThreadAbortException) 
        { 
        } 
       })); 
       _STAThread.SetApartmentState(ApartmentState.STA); 
       _STAThread.IsBackground = true; 
       _STAThread.Start(); 
       mre.Wait(); 
} 

El código inicia un nuevo hilo, ajuste el apartamento a la STA y espera la creación de un objeto COM en ese hilo. El subproceso en sí se ejecuta hasta que se cierra la aplicación (IsBackground = true) o mata el subproceso explícitamente con Thread.Abort().

Pero tenga en cuenta que todas las llamadas a sus objetos COM se organizan y, por lo tanto, se ejecutan serializadas una tras otra en ese único hilo. Eso podría ser un gran cuello de botella en tu aplicación.

ASPCompat = true señala el tiempo de ejecución de ASP.NET, que está utilizando objetos STA COM y ejecuta así la página dentro de un hilo STA. de lo contrario, puede obtener una excepción o todos sus objetos COM se ejecutarán en el subproceso STA generado automáticamente compartido por todas las solicitudes en su página (consulte MSDN aquí: http://msdn.microsoft.com/en-us/library/zwk9h2kb(VS.80).aspx)

+0

Esto significa que si uso ASPCompat y pongo COM Objetos en Sesión, ellos morirán al azar porque el hilo que los creó habrá terminado? –

+1

Creo que no, porque ASP.NET usa un hilo de trabajo para manejar las solicitudes. Los hilos no "morirán" después de procesar una solicitud. Consulte estos artículos de la base de conocimiento en Microsoft declara que es posible almacenar objetos STA COM en estado de sesión pero recomienda que no lo haga: http://support.microsoft.com/kb/243543/en-us, http://support.microsoft .com/kb/243815/en-us – Jan

Cuestiones relacionadas