当在一个线程中使用 OpenFileDialog ofd = new OpenFileDialog();
ofd.ShowDialog(); 会报如下错误:
在可以调用 OLE 之前,必须将当前线程设置为单线程单元(STA)模式。请确保您的 Main 函数带有 STAThreadAttribute 标记。 只有将调试器附加到该进程才会引发此异常。、
解决办法:
1.将跨线程操作检查设置成false , 不建议这么做
Control.CheckForIllegalCrossThreadCalls = false;
- 对于 调用ShowDialog方法可以用this.Invoke(new Action(()=>{}));包围起来,让主线程去调用。
Task.Run(()=>{
//...
this.Invoke(new Action(()=>
{
SaveFileDialog saveFileDialog = new SaveFileDialog();
saveFileDialog.Title = "保存文件";
saveFileDialog.FileName = "save.txt";
if (saveFileDialog.ShowDialog() == DialogResult.OK)
{
//...
}
}));
});
- 通过设置线程的SetApartmentState(ApartmentState.STA)
Thread thread = new Thread(Receive);
thread.SetApartmentState(ApartmentState.STA);
thread.Start();
private void Receive()
{
SaveFileDialog saveFileDialog = new SaveFileDialog();
saveFileDialog.Title = "保存文件";
saveFileDialog.FileName = "save.txt";
if (saveFileDialog.ShowDialog() == DialogResult.OK)
{
//....
}
}