C # WinForms: Cómo establecer la función principal STAThreadAttribute

Obtengo la siguiente excepción cuando llamo a saveFileDialog.ShowDialog() en un hilo de fondo:

El subproceso actual debe establecerse en el modo de apartamento de subproceso único (STA) antes de poder realizar llamadas OLE. Asegúrese de que su función principal tenga marcado STAThreadAttribute.

De acuerdo a esto :

Para solucionar el problema, inserte la instrucción:

 Threading.Thread.CurrentThread.ApartmentState = Threading.ApartmentState.STA; 

en Main a la derecha antes de la statement Application.Run.

Pero la instrucción Application.Run está en Program.cs que parece ser código generado por lo que cualquier cambio puede perderse inesperadamente. Además, no pude encontrar una manera de establecer el hilo actual para STA en el proyecto o las propiedades principales del formulario, pero tal vez estoy buscando en el lugar equivocado. ¿Cuál es la forma correcta de llamar a saveFileDialog.ShowDialog() en un hilo de fondo?

No se debe llamar a ShowDialog () desde una cadena de fondo: use Invoke (…).

 Invoke((Action)(() => { saveFileDialog.ShowDialog() })); 

Solución muy fácil; Simplemente agregue esto sobre el método principal [STAThread]

Entonces su método principal debería verse así

  [STAThread] static void Main(string[] args) { .... } 

Esto funciona para mi.

esto debería funcionar si está creando el hilo en el que llama al showDialog:

 var thread = new Thread(new ParameterizedThreadStart(param => { saveFileDialog.ShowDialog(); })); thread.SetApartmentState(ApartmentState.STA); thread.Start(); 

Agregue el siguiente código en FormLoad

 private void Form1_Load(object sender, EventArgs e) { Thread myth; myth = new Thread(new System.Threading.ThreadStart(CallSaveDialog)); myth.ApartmentState = ApartmentState.STA; myth.Start(); } 

Aquí CallSaveDialog es un hilo y aquí puedes llamar a ShowDialog como este

 void CallSaveDialog(){saveFileDialog.ShowDialog();} 

En su MainForm:

 if (this.InvokeRequired) { this.Invoke(saveFileDialog.ShowDialog()); } else { saveFileDialog.ShowDialog(); } 

O bien, si tendrá otros métodos que deben ejecutarse desde el hilo de la interfaz de usuario:

  private void DoOnUIThread(MethodInvoker d) { if (this.InvokeRequired) { this.Invoke(d); } else { d(); } } 

Luego, llame a su método como tal:

  DoOnUIThread(delegate() { saveFileDialog.ShowDialog(); });