C#无法关闭Background Worker创建的表单

时间:2013-12-10 16:51:38

标签: c# multithreading forms backgroundworker

我的Backgroundworker加载了一个新的“弹出”表单,但是如何终止后台工作者和新创建的表单?

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
    BussyForm bussyForm = new BussyForm();
    bussyForm.ShowDialog();
}

这没有效果:

backgroundWorker1.Dispose();
backgroundWorker1.CancelAsync();
backgroundWorker1 = null;

2 个答案:

答案 0 :(得分:2)

您不应该从非UI线程显示表单。您应该只有一个UI线程,并且只有它应该访问所有用户界面控件。您的非UI线程根本不应访问UI元素。

您应该从UI线程显示给定的忙碌弹出窗口。

请求取消BackgroundWorker或处理它,不会关闭表单,或强制线程停止执行,这就是您的表单保持打开的原因。

相反,只需在启动后台工作程序时从UI线程显示弹出窗口,并在窗体上完成BGW已完成的事件调用Close

private void button1_Click(object sender, EventArgs args)
{
    BusyForm busyForm = new BusyForm();

    BackgroundWorker worker = new BackgroundWorker();
    worker.DoWork += worker_DoWork;
    worker.RunWorkerCompleted += (_, e) => { busyForm.Close(); };
    worker.RunWorkerAsync();

    busyForm.ShowDialog();
}

答案 1 :(得分:0)

CancelAsync实际上并没有中止你的线程或类似的东西。它向工作线程发送一条消息,告知应该通过BackgroundWorker.CancellationPending取消工作。您在后台运行的DoWork委托必须定期检查此属性并自行处理取消。

您致电bussyForm.ShowDialog();,因此您需要手动关闭此表单。