Saltar al contenido

Que hace [STAThread] ¿hacer?

Solución:

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

MSDN explica el motivo con un poco más de detalle:

STAThreadAttribute indica que el modelo de subprocesos COM para la aplicación es un apartamento de un solo subproceso. Este atributo debe estar presente en el punto de entrada de cualquier aplicación que utilice Windows Forms; si se omite, es posible que los componentes de Windows no funcionen 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 obtener una vista más detallada de cómo funciona el modelo de subprocesos 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ás 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 modelo STA de varios subprocesos, obtendrá objetos corruptos.

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

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

STAThreadAttribute marca un subproceso para usar el apartamento COM de subproceso único si se necesita COM. De forma predeterminada, .NET no inicializará COM en absoluto. Solo cuando se necesita COM, como cuando se crea un objeto COM o un control COM o cuando se necesita arrastrar y soltar, COM se inicializa. Cuando eso sucede, .NET llama a la función CoInitializeEx subyacente, que toma una bandera que indica si se debe unir el subproceso a un apartamento de subproceso múltiple o de subproceso único.

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

y

¿Por qué se requiere STAThread?

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *