在STA线程中:Form.Hide()= BackgroundWorker事件没有触发?

时间:2010-06-21 10:41:20

标签: c# .net winforms

我想在backgroundworker工作时隐藏主窗口,但当我在this.Hide()之前将主窗体设置为backgroundworker.RunWorkerAsync()时,ProgressChangedRunWorkerCompleted都是不开火。我怎样才能做到这一点?感谢。

更多代码: ProgressChangedRunWorkerCompleted正在解雇:

private void button1_Click(object sender, EventArgs e)
 {
    backgroundworker.RunWorkerAsync();
 }

ProgressChangedRunWorkerCompleted未触发:

private void button1_Click(object sender, EventArgs e)
 {
    this.Hide();
    backgroundworker.RunWorkerAsync();
 }

抱歉:更多信息: 该表单用于共享(COM)Outlook加载项。

在outlook中有一个按钮,单击此按钮加载表单,当我在这样的新线程中显示我的表单时会出现问题:

private void MyButton_Click(CommandBarButton cmdBarbutton, ref bool cancel)
{              
    System.Threading.Thread tt = new System.Threading.Thread(new System.Threading.ThreadStart(showwindow));
    tt.SetApartmentState(System.Threading.ApartmentState.STA);
    tt.Start();               
}


private void showwindow()
{
    GUIForm = new MyForm();           
    GUIForm.ShowDialog();
}

如果我只是加载表单,没问题:

private void MyButton_Click(CommandBarButton cmdBarbutton, ref bool cancel)
{              
   showwindow();              
}


private void showwindow()
{
    GUIForm = new MyForm();           
    GUIForm.ShowDialog();
}

如何将GUI放在新线程中并在GUI中仍然有我的后台事件?

1 个答案:

答案 0 :(得分:1)

无法重现这一点。

适用于我的计算机。

您可能正在DoWork(或者可能是ProgressChanged)中执行需要可见Window的操作。


在你的扩展问题中,Bgw似乎不再发挥作用......

你不能简单地在另一个线程中启动(显示)一个窗口,你也需要在线程上运行一个MessagePump。

对于Thread场景,您可以使用:

private void showwindow()
{
    GUIForm = new MyForm();           
    //GUIForm.ShowDialog();
    Application.Run(GUIForm);
}

但是那将运行Form Modeless,而不是Modal。