Estoy aprendiendo C# 3.5 y quiero saber qué hace [STAThread]
en nuestros programas?¿Qué hace [STAThread]?
Respuesta
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).
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.
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
Realmente, se trata solo de tratar con componentes COM, como los diálogos del sistema operativo y los componentes de terceros. – Noldorin
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
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
- 1. STAThread y multithreading
- 2. STAThread falta, pero está ahí
- 3. WPF con Windows Forms - STAThread
- 4. ¿Podemos usar hilo dentro de [STAThread] principal?
- 5. ¿Qué hace [:]?
- 6. ¿Por qué hace esto lo que hace?
- 7. ¿Qué hace "make check"?
- 8. ¿Qué hace waitpid()?
- 9. ¿Qué hace aspnet_regiis.exe
- 10. ¿Qué hace este código?
- 11. ¿Qué hace stopLoading() realmente?
- 12. AutoFac: ¿Qué hace PropertyWiringFlags.AllowCircularDependencies?
- 13. ¿Qué hace este script?
- 14. ¿Qué hace @synchronized()?
- 15. ¿Qué hace document.domain = document.domain?
- 16. ¿Qué hace L?
- 17. ¿Qué hace -XX: MaxPermSize?
- 18. ¿Qué hace? ...: ... ¿hacer?
- 19. ¿Qué hace '@_' en Perl?
- 20. ¿Qué hace Application.Run()?
- 21. ¿Qué hace un IISReset?
- 22. ¿Qué hace ReliabilityContractAttribute?
- 23. ¿Qué hace Html.HiddenFor?
- 24. Android - ¿Qué hace adapter.notifyDataSetInvalidated?
- 25. ¿Qué hace pg_escape_string exactamente?
- 26. ¿Qué hace testAndroidTestCaseSetUpProlyly
- 27. ¿Qué hace fork = "true"?
- 28. ¿Qué hace DbConnection.EnlistTransaction?
- 29. ¿Qué hace mod_pagespeed?
- 30. ¿Qué hace __sync_synchronize?
idea de por qué CompactFramework no soporta '[STAThread]'? – bvdb