c# .net multithreading sta

c# - STAThread y multihilo



.net multithreading (3)

Apartment Threading es un concepto COM; si no está utilizando COM, y ninguna de las API a las que llama utiliza COM "debajo de las sábanas", entonces no necesita preocuparse por los apartamentos.

Si necesita estar al tanto de los apartamentos, los detalles pueden complicarse un poco ; una versión probablemente demasiado simplificada es que los objetos COM etiquetados como STA se deben ejecutar en un STAThread, y los objetos COM marcados MTA se deben ejecutar en un hilo MTA. Al usar estas reglas, COM puede optimizar las llamadas entre estos diferentes objetos, evitando las referencias donde no es necesario.

Del artículo de MSDN sobre STAThread:

Indica que el modelo de subprocesamiento COM para una aplicación es apartamento de subproceso único (STA).

(Como referencia, ese es el artículo completo ).

Apartamento de una sola hebra ... OK, eso pasó por mi cabeza. Además, leí en alguna parte que a menos que tu aplicación use interoperabilidad COM, este atributo en realidad no hace nada en absoluto. Entonces, ¿qué es exactamente lo que hace, y cómo afecta esto a las aplicaciones multiproceso? ¿Deberían las aplicaciones de subprocesamiento múltiple (que incluyen cualquier cosa desde cualquier persona que utilice Timer s a llamadas a métodos asíncronos, no solo grupos de subprocesos y similares) usar MTAThread, incluso si es ''solo para estar seguro''? ¿Qué hace STAThread y MTAThread en realidad?


Lo que hace eso, asegura que CoInitialize se llame especificando COINIT_APARTMENTTHREADED como el parámetro. Si no utiliza ningún componente COM o control ActiveX, no tendrá ningún efecto sobre usted. Si lo haces, entonces es algo crucial.

Los controles con rosca de apartamento son efectivamente de rosca simple, las llamadas realizadas a ellos solo se pueden procesar en el departamento en el que se crearon.

Algunos detalles más de MSDN:

Los objetos creados en un apartamento de subproceso único (STA) reciben llamadas de método solo del subproceso de su apartamento, por lo que las llamadas se serializan y llegan solo a límites de cola de mensajes (cuando se llama a la función Win32 PeekMessage o SendMessage).

Los objetos creados en un subproceso COM en un apartamento de subprocesos múltiples (MTA) deben poder recibir llamadas de método desde otros subprocesos en cualquier momento. Por lo general, implementaría algún tipo de control de concurrencia en un código de objeto multiproceso utilizando primitivas de sincronización Win32 como secciones críticas, semáforos o mutex para ayudar a proteger los datos del objeto.

Cuando un objeto que está configurado para ejecutarse en el departamento con hilos neutrales (NTA) es llamado por un hilo que está en un STA o en el MTA, ese hilo se transfiere al NTA. Si este hilo posteriormente llama a CoInitializeEx, la llamada falla y devuelve RPC_E_CHANGED_MODE.


STAThread se escribe antes de la función principal de un proyecto de GUI de C #. No hace más que permitir que el programa cree un solo hilo.