2012-01-10 62 views
0

我有一个运行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)。

谢谢

回答

2

发现它!

与我一起工作的一位程序员建议了一个实际工作的简单解决方案。 。 而不是运行在打开文件对话框上的第三线程只是在主窗体上运行(即开始工作线程的一个

它看起来像这样:

//Code inside worker method 
OpenFileDialog dialog= new OpenFileDialog(); 
DialogResult result = DialogResult.None; 

Invoke(new MethodInvoker(delegate() { result = dialog.ShowDialog(this); })); 
if (result == DialogResult.OK) 
{ 
    ... 
} 

这样我阻止的主要形式被点击并打开文件对话框中STA线程中运行。

想想看,解决它是一个C++程序员之一。;-)

我希望这将是有帮助的人......

相关问题