【发布时间】:2012-01-11 14:17:57
【问题描述】:
我有一个运行 BackgroundWorker 线程的主窗体。 当工人运行时,我“冻结”主窗体并等待它完成,同时显示其进度。
在其中一个场景中,工作人员可以显示一个 OpenFileDialog 供用户选择文件。 我使用第三个线程来运行 OpenFileDialog 并将它的 ApartmentState 设置为 STA,因为 OpenFileDialog 需要它(如果我不这样做则抛出异常)并且工作人员 ApartmentState 是 MTA。
问题是我想将主窗体作为参数传递给 OpenFileDialog 线程,以便在调用 OpenFileDialog.ShowDialog 时可以使用它。 像这样的:
public void ThreadProcShowDialog(object param)
{
Form parent = (Form)param;
dialog.ShowDialog(parent);
}
当然,ShowDialog 会抛出:
跨线程操作无效:从 线程不是创建它的线程。
我怎样才能以线程安全的方式做到这一点?
这样做的目的是,OpenFileDialog 将在 STA 线程中运行,同时阻止主窗体在其上显示(阻止用户单击下面的窗体,从而隐藏 OpenFileDialog)。
谢谢
【问题讨论】:
标签: backgroundworker openfiledialog sta mta