我的Backgroundworker加载了一个新的“弹出”表单,但是如何终止后台工作者和新创建的表单?
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
BussyForm bussyForm = new BussyForm();
bussyForm.ShowDialog();
}
这没有效果:
backgroundWorker1.Dispose();
backgroundWorker1.CancelAsync();
backgroundWorker1 = null;
答案 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();
,因此您需要手动关闭此表单。