【发布时间】:2014-10-06 15:36:34
【问题描述】:
我遇到了后台工作人员的问题。 当我取消后台工作人员时,它也会关闭表单,我不想要它。 我只想停止后台工作程序,并将表单保留在屏幕上,并向用户说一条消息,例如“程序已被用户停止”
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”按钮时,它应该向我的 BWorker 发送一个 CancelSignal。 每次我的 BWorker 工作时,我都会在做任何事情之前检查这个 CancellationPending 信号。
使用此代码,当点击“stopChild”时表单会关闭 当我删除 "this.Dispose()" 时,BWorker 不会停止。为什么?
【问题讨论】:
-
如果您在 if((worker.CancelationPending == true)) 行上放置一个断点,在您单击取消后是否显示为 true?会不会是因为完成的工作太长了,以至于您愿意等待完成这项检查所需的时间更长?
标签: c# asynchronous backgroundworker cancellation