ventajas que mejor aplicaciones aplicacion c# .net winforms sta

c# - que - ¿Por qué las aplicaciones WinForms STAThread de forma predeterminada?



winforms vs wpf 2017 (4)

Cuando crea una aplicación WinForms vacía con Visual Studio, la plantilla tiene el atributo STAThread en la clase de aplicación principal.

He estado leyendo algunos documentos al respecto, pero no estoy seguro si lo entendí en absoluto.

Realmente tengo algunas preguntas al respecto:

  1. ¿Por qué se agrega este atributo?
  2. Qué significa eso?
  3. ¿Qué pasa si eliminas este atributo?

Significa que los programas de Windows Forms usan un estado de un solo subproceso. MTA y estados de apartamento de rosca libre no son compatibles.


Para citar de un blog de MSDN ,

Cuando se aplica el atributo STAThreadAttribute, cambia el estado del piso del hilo actual para que sea de un solo hilo. Sin entrar en una gran discusión sobre COM y threading, este atributo asegura el mecanismo de comunicación entre el hilo actual y otros hilos que pueden querer hablar a través de COM. Cuando usa Windows Forms, dependiendo de la característica que esté utilizando, puede estar utilizando la interoperabilidad COM para comunicarse con los componentes del sistema operativo. Buenos ejemplos de esto son el Portapapeles y los Diálogos de Archivos.


3. ¿Qué sucede si elimina este atributo?

Solo agrego un ejemplo simple que demuestra el problema.

Creé una aplicación WinForms simple con un botón y un OpenFileDialog. En el botón, haga clic en Ejecutar un hilo que muestra OpenFileDialog. Lanzo la aplicación con y sin STAThread y los resultados de hacer clic en el botón son los mismos: arroja la excepción "Operación entre hilos no válida: Control ''Form1'' al que se accede desde un hilo que no sea el hilo en el que se creó". Parece que no hay diferencia. Pero no.

Luego cambié mostrando openFileDialog llamando al siguiente método:

private void ShowOFD() { if (InvokeRequired) { BeginInvoke(new Action(ShowOFD)); return; } openFileDialog1.ShowDialog(this); }

Con STAThread funciona bien como se esperaba. Sin STAThread arroja la excepción: "El hilo actual debe establecerse en el modo de apartamento de una sola rosca (STA) antes de que se puedan realizar llamadas OLE. Asegúrese de que su función principal tenga marcado STAThreadAttribute. Esta excepción solo se genera si se conecta un depurador a el proceso".

Luego lanzo la aplicación varias veces sin depurador (separado de Visual Studio). Una vez la aplicación simplemente se cerró silenciosamente, en otra ocasión la aplicación se cerró con el mensaje "vshost ha dejado de funcionar"


1. ¿Por qué se agrega este atributo?

Porque es requerido por el modelo de objetos ActiveX. Y puede soltar los controles ActiveX en un WinForm (por lo tanto, existe compatibilidad) O algunas clases .NET usan controles nativos que requieren ese atributo.

2. ¿Qué significa?

Significa que el hilo se ejecuta en el modelo de apartamento de subproceso único .

3. ¿Qué sucede si elimina este atributo?

Si se elimina el atributo, el comportamiento no está definido. El programa puede fallar al azar, con mensajes de error a veces razonables. Por ejemplo, las cosas pueden funcionar ahora, luego rompa con un paquete de servicio.