I get the following exception when calling saveFileDialog.ShowDialog()
in a background thread:
Current thread must be set to single thr
On your MainForm:
if (this.InvokeRequired) {
this.Invoke(saveFileDialog.ShowDialog());
} else {
saveFileDialog.ShowDialog();
}
Or, if you will have other methods that need to be run from the UI thread:
private void DoOnUIThread(MethodInvoker d) {
if (this.InvokeRequired) { this.Invoke(d); } else { d(); }
}
Then, call your method as such:
DoOnUIThread(delegate() {
saveFileDialog.ShowDialog();
});
Solution very easy;
Just add this on top of the Main method [STAThread]
So your main method should look like this
[STAThread]
static void Main(string[] args)
{
....
}
It works for me.
this should work if you are creating the thread in which you call the showDialog:
var thread = new Thread(new ParameterizedThreadStart(param => { saveFileDialog.ShowDialog(); }));
thread.SetApartmentState(ApartmentState.STA);
thread.Start();
Add following code on 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();
}
Here CallSaveDialog
is a thread and here you can call ShowDialog
like this
void CallSaveDialog(){saveFileDialog.ShowDialog();}
ShowDialog() shouldn't be called from a background thread - use Invoke(..).
Invoke((Action)(() => { saveFileDialog.ShowDialog() }));