tags:

views:

55

answers:

1

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


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?

A: 

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.

Henk Holterman
Found out it's not the DoWork but the Form itself, please see my edited post. thanks.
Bolu
Thank you, that solved the problem!
Bolu