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?

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top