¿Qué hace [STAThread]?

293

Estoy aprendiendo C # 3.5 y quiero saber qué [STAThread]hace en nuestros programas.

odiseh
fuente

Respuestas:

240

Esto STAThreadAttributees esencialmente un requisito para que la bomba de mensajes de Windows se comunique con los componentes COM. Aunque los formularios Windows Forms principales no usan COM, muchos componentes del sistema operativo, como los cuadros de diálogo del sistema, sí usan esta tecnología.

MSDN explica la razón con un poco más de detalle:

STAThreadAttribute indica que el modelo de subprocesamiento COM para la aplicación es un apartamento de subproceso único. Este atributo debe estar presente en el punto de entrada de cualquier aplicación que use Windows Forms; Si se omite, los componentes de Windows podrían no funcionar correctamente. Si el atributo no está presente, la aplicación usa el modelo de apartamento multiproceso, que no es compatible con Windows Forms.

Esta publicación de blog ( ¿Por qué se requiere STAThread? ) También explica bastante bien el requisito. Si desea una visión más detallada sobre cómo funciona el modelo de subprocesamiento en el nivel CLR, consulte este artículo de MSDN Magazine de junio de 2004 (Archivado, abril de 2009).

Noldorin
fuente
1
¿Alguna idea de por qué CompactFramework no es compatible [STAThread]?
bvdb
1
stackoverflow.com/questions/4154429/apartmentstate-for-dummies esta respuesta es bastante comprensible para los mortales como yo. Agregado solo como referencia aquí
Barış Akkurt
41

Le dice al compilador que está en un modelo de apartamento de un solo hilo. Esta es una cosa COM malvada, generalmente se usa para Windows Forms (GUI) ya que usa Win32 para su dibujo, que se implementa como STA. Si está utilizando algo que es el modelo STA de varios subprocesos, obtendrá objetos corruptos.

Es por eso que debe invocar a la interfaz gráfica de usuario desde otro hilo (si ha realizado alguna codificación de formularios).

Básicamente no te preocupes por eso, solo acepta que los hilos de la GUI de Windows deben estar marcados como STA; de lo contrario, suceden cosas extrañas.

Spence
fuente
2
STAThread no tiene nada que ver con el requisito de invocar el hilo principal al acceder a la GUI. Esto se debe simplemente a la naturaleza de la bomba de mensajes de Windows y no se puede evitar de manera más general en aplicaciones multiproceso.
Noldorin
3
Realmente, solo se trata de tratar con componentes COM como los diálogos del sistema operativo y componentes de terceros.
Noldorin
3
Win32 no lleva el concepto de enhebrar apartamentos, su COM presenta el concepto. COM "reasigna" lo que era un sistema agnóstico de subproceso completo (la bomba de mensajes de Windows) como un medio para sincronizar / serializar la ejecución de código en apartamentos COM.
AnthonyWJones
1
Simplemente acepte que los cabezales de la interfaz gráfica de usuario de Windows deben marcarse como STA; de lo contrario, suceden cosas extrañas. :))))))
Nipuna
1
@Noldorin "requisito para invocar el hilo principal": técnicamente no es un requisito . Las excepciones de hilos cruzados no ocurren fuera del depurador. Ref: stackoverflow.com/questions/3972727/… . Sin embargo, no digo que no debas resolver este problema.
Shiv
31

El atributo STAThreadAttribute marca un subproceso para usar el apartamento COM de subproceso único si se necesita COM. Por defecto, .NET no inicializará COM en absoluto. Es solo cuando se necesita COM, como cuando se crea un objeto COM o Control COM o cuando se necesita arrastrar y soltar, que COM se inicializa. Cuando eso sucede, .NET llama a la función CoInitializeEx subyacente, que toma un indicador que indica si se debe unir el subproceso a un departamento de subprocesos múltiples o de un solo subproceso.

Lea más información aquí (Archivado, junio de 2009)

y

¿Por qué se requiere STAThread?

rahul
fuente