2009-09-01 30 views

Respuesta

199

El STAThreadAttribute es esencialmente un requisito para que la bomba de mensajes de Windows se comunique con los componentes COM. Aunque Windows Forms central no utiliza COM, muchos componentes del sistema operativo, como los cuadros de diálogo del sistema, usan esta tecnología.

MSDN explica la razón en algo más de detalle:

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

This blog post (¿Por qué es necesaria STAThread?) también explica el requisito bastante bien. Si desea una visión más detallada de cómo funciona el modelo de subprocesamiento en el nivel de CLR, consulte this MSDN Magazine article from June 2004 (Archivado, abril de 2009).

+1

idea de por qué CompactFramework no soporta '[STAThread]'? – bvdb

20

Le dice al compilador que está en un modelo de Single Thread Apartment. Esta es una cosa mal COM, 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 modelo STA de múltiples hilos, entonces obtiene objetos corruptos.

Es por eso que tiene que invocar en el Gui desde otro hilo (si ha realizado alguna codificación de formularios).

Básicamente no se preocupe, solo acepte que los hilos de la GUI de Windows deben estar marcados como STA, de lo contrario suceden cosas raras.

+1

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, se trata solo de tratar con componentes COM, como los diálogos del sistema operativo y los componentes de terceros. – Noldorin

+3

Win32 no tiene ningún concepto de ensartar apartamentos, su COM que presenta el concepto. COM "re-tasks" lo que era un sistema completamente agnóstico de hilos (la bomba de mensajes de Windows) como un medio para sincronizar/serializar la ejecución de código en departamentos COM. – AnthonyWJones

27

El STAThreadAttribute marca un hilo utilizar el único subproceso COM Apartamento si se necesita COM. Por predeterminado, .NET no inicializará COM en todos. Es solo cuando se necesita COM, como cuando se crea un objeto COM o COM Control o cuando es necesario arrastrar y soltar , que COM se inicializa. Cuando ocurre , .NET llama a la función CoInitializeEx subyacente, que toma un indicador que indica si para unir el subproceso a un o subproceso de un solo subproceso.

leer más información here (archivados, junio de 2009)

y

Why is STAThread required?