如何取消一个后台工作与睡眠
本文关键字:工作 后台 一个 何取消 取消 | 更新日期: 2023-09-27 18:11:19
我在取消一个包含Thread.Sleep(100)
的后台worker时遇到了问题。
private void backgroundWorker1_DoWork(object sender, System.ComponentModel.DoWorkEventArgs e)
{
int count;
try
{
count = int.Parse(textBox3.Text);
for (int i = 0; i < count; i++)
{
backgroundWorker1.ReportProgress((int)(((double)(i + 1) / count) * 1000));
//Computation code
Thread.Sleep(int.Parse(textBox4.Text));
}
}
catch (Exception ex)
{
request.DownloadData(url);
MessageBox.Show(ex.Message);
}
}
private void cancel_Click(object sender, EventArgs e)
{
backgroundWorker1.CancelAsync();
progressBar1.Value = 0;
}
如果我删除Thread.Sleep(100)
然后取消工作,否则它只是继续运行(进度条不停止)。
编辑:添加剩余的代码
当你调用CancelAsync时,它只是设置一个名为CancellationPending
的属性为true。现在,您的后台工作程序可以并且应该定期检查该标志是否为真,以优雅地完成其操作。所以你需要把后台任务拆分成几个可以检查是否取消的部分。
private void DoWork(object sender, System.ComponentModel.DoWorkEventArgs e)
{
while(true)
{
if(worker.CancellationPending)
{
e.Cancel = true;
return;
}
Thread.Sleep(100);
}
}
使用线程。当你想取消后台线程时,中断以退出WaitSleepJoin状态。
http://msdn.microsoft.com/en-us/library/system.threading.thread.interrupt.aspx