c#后台工作人员关闭表单
本文关键字:表单 工作人员 后台 | 更新日期: 2023-09-27 18:17:43
我有一个后台工作人员的问题。当我取消后台工作者时,它也关闭了表单,我不想要它。我只是想停止后台工作者,并保持表单在屏幕上,并告诉用户一个消息,如"程序被用户停止"
public BackgroundWorker bw = new BackgroundWorker() { WorkerSupportsCancellation = true };
public Form1()
{
bw.WorkerSupportsCancellation = true;
InitializeComponent();
}
private void stopChild_Click(object sender, EventArgs e)
{
if (bw.IsBusy)
{
bw.CancelAsync();
this.Dispose();
}
}
public void startParListe()
{
bw.DoWork += new DoWorkEventHandler(bw_DoWork);
if (bw.IsBusy != true)
bw.RunWorkerAsync();
}
public void bw_DoWork(object sender, DoWorkEventArgs e)
{
BackgroundWorker worker = sender as BackgroundWorker ;
for (int i = 0; i < countPlages; i++)
{
if ((worker.CancellationPending == true))
{
e.Cancel = true;
}
#do something else
}
}
所以,当用户点击"stopChild"按钮时,它应该发送一个CancelSignal给我的BWorker。每次我的BWorker工作时,我在做任何事情之前都会检查这个CancellationPending信号。
使用这段代码,当点击"stopChild"时,窗体关闭。当我删除"this.Dispose() ", BWorker不停止。为什么?
您没有正确处理CancellationPending
:
if ((worker.CancellationPending == true))
{
e.Cancel = true;
}
我不确定e.Cancel
应该做什么,但你仍然继续在for循环中工作,因为你没有离开循环。改为:
if (worker.CancellationPending) // btw - avoid unnecessarily verbous code
{
break;
}
后台工作人员不关闭你的形式,this.Dispose
。你需要省略它。this.Dispose
帮助停止后台worker的原因是因为它属于表单,所以关闭表单也关闭了worker。但是一旦你像上面描述的那样修复了取消,你就不需要Dispose
了
当你设置e.Cancel为true时,你应该跳出循环(同时,this.Dispose()正在关闭你的表单:
public void bw_DoWork(object sender, DoWorkEventArgs e)
{
BackgroundWorker worker = sender as BackgroundWorker ;
for (int i = 0; i < countPlages; i++)
{
if ((worker.CancellationPending == true))
{
e.Cancel = true;
break;
}
#do something else
}
}