我想在backgroundworker工作时隐藏主窗口,但当我在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();
}
如何将GUI放在新线程中并在GUI中仍然有我的后台事件?
答案 0 :(得分:1)
无法重现这一点。
适用于我的计算机。
您可能正在DoWork(或者可能是ProgressChanged)中执行需要可见Window的操作。
在你的扩展问题中,Bgw似乎不再发挥作用......
你不能简单地在另一个线程中启动(显示)一个窗口,你也需要在线程上运行一个MessagePump。
对于Thread场景,您可以使用:
private void showwindow()
{
GUIForm = new MyForm();
//GUIForm.ShowDialog();
Application.Run(GUIForm);
}
但是那将运行Form Modeless,而不是Modal。