Pregunta
Del artículo de MSDN en STAThread:
Indica que el modelo de subprocesamiento COM para una aplicación es un apartamento de un solo subproceso (STA).
(para referencia, eso es el artículo completo .)
Apartamento de un solo hilo ... OK, eso pasó por encima de mi cabeza. Además, leí en alguna parte que, a menos que su aplicación utilice la interoperabilidad COM, este atributo no hace nada. Entonces, ¿qué es exactamente lo que hace y cómo afecta a las aplicaciones multiproceso? ¿Deberían las aplicaciones multiproceso (que incluyen cualquier cosa, desde cualquier persona que use el Timer
) hasta las llamadas de método asíncronas, no solo las agrupaciones de hilos y similares, utilicen MTAThread, incluso si es 'solo para estar seguro'? ¿Qué hacen realmente STAThread y MTAThread?
Solución
El subprocesamiento de apartamento es un concepto COM; Si no estás usando COM, y ninguna de las API a las que llamas usa COM " debajo de las tapas " ;, entonces no debes preocuparte por los apartamentos.
Si necesita conocer los apartamentos, los detalles pueden obtener un poco complicado ; una versión probablemente simplificada es que los objetos COM etiquetados como STA deben ejecutarse en un STAThread, y los objetos COM marcados como MTA deben ejecutarse en un subproceso MTA. Usando estas reglas, COM puede optimizar las llamadas entre estos diferentes objetos, evitando el cálculo de referencias donde no es necesario.
Otros consejos
Lo que hace eso asegura que se llame a CoInitialize
especificando COINIT_APARTMENTTHREADED como parámetro. Si no utiliza ningún componente COM o controles ActiveX, no tendrá ningún efecto en usted. Si lo haces, entonces es algo crucial.
Los controles que tienen subprocesos de apartamentos son efectivamente subprocesos individuales, las llamadas que se realizan a ellos solo pueden procesarse en el apartamento en el que se crearon.
Algunos detalles más de MSDN:
Objetos creados en un solo hilo apartamento (STA) recibe llamadas de método sólo desde el hilo de su apartamento, por lo que Las llamadas son serializadas y llegan solo en los límites de la cola de mensajes (cuando Función Win32 PeekMessage o Se llama SendMessage).
Objetos creados en un hilo COM en un apartamento multiproceso (MTA) debe ser capaz de recibir llamadas de método de Otros hilos en cualquier momento. Lo harías típicamente implementar alguna forma de control de concurrencia en un multiproceso código del objeto usando Win32 primitivas de sincronización tales como Secciones críticas, semáforos, o exclusión mutua para ayudar a proteger el objeto datos.
Cuando un objeto que está configurado para correr en el apartamento de hilo neutro (NTA) es llamado por un hilo que está en ya sea una STA o el MTA, ese hilo Traslados a la NTA. Si este hilo posteriormente llama CoInitializeEx, el la llamada falla y vuelve RPC_E_CHANGED_MODE.
STAThread se escribe antes de la función principal de un proyecto GUI de C #. No hace nada, pero permite que el programa cree un solo hilo.