saving change archivo c# winforms

change - C#WinForms: Cómo configurar la función principal STAThreadAttribute



properties.settings.default c# (5)

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

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

De acuerdo a this :

Para solucionar el problema, inserte la declaración:

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

en la derecha principal antes de la instrucción Application.Run.

Pero la declaración Application.Run está en Program.cs, que parece ser un código generado, por lo que cualquier cambio podría perderse inesperadamente. Además, no pude encontrar una manera de establecer el hilo actual en STA en las propiedades del proyecto o del formulario principal, 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?


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í puede llamar a ShowDialog como este

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


En su MainForm:

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

O, si tiene 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(); } }

Entonces, llama a tu método como tal:

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


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

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


No se debe llamar a ShowDialog () desde un subproceso en segundo plano, use Invoke (..).

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


Solución muy fácil; Solo agrega esto en la parte superior del método principal [STAThread]

Así que tu método principal debería verse así

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

Esto funciona para mi.