Respuestas:
Esto STAThreadAttribute
es 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).
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.
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
[STAThread]
?