开发者

In a STA thread: Form.Hide() = BackgroundWorker event not firing?

I want to hide the main window while the backgroundworker is working, but When I set the main form as this.Hide() before the backgroundworker.RunWorkerAsync(), Both ProgressChanged and RunWorkerCompleted are not firing. How can I achieve this? thanks.

More code: ProgressChanged and RunWorkerCompleted are firing with:

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

ProgressChanged and RunWorkerCompleted are not firing with:

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

Sorry: More information: The form is used in a shared (COM) Outlook add-in.

In outlook there is a button, click this button to load the form, the problem happens when I show my form in a new thread like this:

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();
}

If I just load the form, no problem:

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


开发者_Python百科private void showwindow()
{
    GUIForm = new MyForm();           
    GUIForm.ShowDialog();
}

How can I put the GUI in a new thread and still have my backgroundwork events within the GUI?


Cannot reproduce this.

It works on my computer.

You are probably doing something inside your DoWork (or maybe ProgressChanged) that needs a visible Window.


In your extended question the Bgw doesn't seem to play a role anymore...

You cannot simply start (show) a Window in another Thread, you need to run a MessagePump on the Thread as well.

For the Thread scenario, you could use:

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

But that will run the Form Modeless, not Modal.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜