C#Can';t关闭后台工作人员创建的窗体
我的Backgroundworker加载了一个新的“弹出”表单,但是我如何终止后台工作人员和新创建的表单C#Can';t关闭后台工作人员创建的窗体,c#,multithreading,forms,backgroundworker,C#,Multithreading,Forms,Backgroundworker,我的Backgroundworker加载了一个新的“弹出”表单,但是我如何终止后台工作人员和新创建的表单 private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) { BussyForm bussyForm = new BussyForm(); bussyForm.ShowDialog(); } 这没有效果: backgroundWorker1.Dispose(); backgroundWor
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
BussyForm bussyForm = new BussyForm();
bussyForm.ShowDialog();
}
这没有效果:
backgroundWorker1.Dispose();
backgroundWorker1.CancelAsync();
backgroundWorker1 = null;
CancelAsync
实际上不会中止线程或类似的操作。它向工作线程发送一条消息,即应通过BackgroundWorker.CancellationPending
取消工作。在后台运行的DoWork委托必须定期检查此属性并自行处理取消
调用
bussyForm.ShowDialog()代码>因此您需要手动关闭此表单。您不应该从非UI线程显示表单。您应该只有一个UI线程,并且只有它才能访问所有用户界面控件。非UI线程根本不应该访问UI元素
您应该从UI线程显示给定的繁忙弹出窗口
从BackgroundWorker
请求取消或处理它不会关闭表单,也不会强制线程停止执行,这就是表单保持打开状态的原因
相反,在启动后台工作程序时,只需从UI线程显示弹出窗口,并在表单上显示BGW已完成的事件调用关闭
:
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();
}
信息和。您是否尝试backgroundWorker1.CancellationPending?问题是我有两个UI线程,所以我返回到一个,现在它可以正常工作了。。我理解。我需要重新考虑我的设计。谢谢你的代码!