В потоке STA: Form.Hide () = BackgroundWorker событие не запускается? - PullRequest
1 голос
/ 21 июня 2010

Я хочу скрыть главное окно во время работы фонового работника, но когда я устанавливаю основную форму как this.Hide() до backgroundworker.RunWorkerAsync(), оба ProgressChanged и RunWorkerCompleted не запускаются. Как мне этого добиться? спасибо.

Еще код: ProgressChanged и RunWorkerCompleted ведут огонь с:

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

ProgressChanged и RunWorkerCompleted не стреляют с:

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

Как я могу поместить графический интерфейс в новый поток и при этом сохранить фоновые события в графическом интерфейсе?

1 Ответ

1 голос
/ 21 июня 2010

Невозможно воспроизвести это.

Работает на моем компьютере.

Вы, вероятно, делаете что-то внутри вашего DoWork (или, может быть, ProgressChanged), которому нужно видимое окно.


В вашем расширенном вопросе Bgw, похоже, больше не играет роли ...

Вы не можете просто запустить (показать) окно в другом потоке, вам также нужно запустить MessagePump в потоке.

Для сценария Thread вы можете использовать:

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

Но это будет запускать форму немодально, а не модально.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...