如何取消一个后台工作与睡眠

本文关键字:工作 后台 一个 何取消 取消 | 更新日期: 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