如何取消睡眠后台工作人员?

时间:2011-10-14 10:14:30

标签: c# winforms backgroundworker thread-sleep

我在取消其中有Thread.Sleep(100)的后台工作程序时遇到了问题。

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),则取消有效,但不会继续进行(进度条不会停止)。

编辑:添加了其余代码

2 个答案:

答案 0 :(得分:6)

当您调用CancelAsync时,它只会将名为CancellationPending的属性设置为true。现在你的后台工作者可以而且应该定期检查这个标志是否为真,以便优雅地完成它的操作。因此,您需要将后台任务拆分为可以检查取消的部分。

private void DoWork(object sender, System.ComponentModel.DoWorkEventArgs e)
    {
        while(true)
        {
            if(worker.CancellationPending)
            {
                e.Cancel = true;
                return;
            }

            Thread.Sleep(100);
        }
    }

答案 1 :(得分:0)

如果要取消后台线程,请使用Thread.Interrupt从WaitSleepJoin状态退出。

http://msdn.microsoft.com/en-us/library/system.threading.thread.interrupt.aspx