【问题标题】:How to cancel a background worker with sleep?如何取消带睡眠的后台工作人员?
【发布时间】:2011-10-14 10:14:29
【问题描述】:

我无法取消其中包含 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),那么取消操作会起作用,否则它会继续进行(进度条不会停止)。

编辑:添加其余代码

【问题讨论】:

  • 你能发布循环的其余部分吗?它是否在每次迭代时检查一些标志?减少睡眠时间,比如说 1 解决问题吗?
  • Sleep(100) 正在处理循环中?
  • 代码不完整。只是 Sleep(100) 调用只能延迟取消一点。一定有别的东西。
  • stackoverflow 上有一个类似的问题。见stackoverflow.com/questions/800767/…
  • 好吧,我唯一添加的就是将 Sleep(100) 放在 try-catch 中。

标签: c# winforms backgroundworker thread-sleep


【解决方案1】:

当您调用 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 但是,这并不能解释在没有 Thread.Sleep 的情况下它是如何工作的。
  • @Joey - 当然可以。我们不知道循环实际上在做什么。
【解决方案2】:

当你想取消后台线程时,使用 Thread.Interrupt 退出 WaitSleepJoin 状态。

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

【讨论】:

  • 如果有更优雅的方式(即使用worker.CacellationPending),我认为中断线程是一件坏事。
  • Thread.Interrupt 只是想取消时退出休眠状态。之后,您捕获 ThreadInterruptedException 并检查 CancellationPending。
  • 我希望缩短睡眠时间,这样您就不必担心会收到ThreadInterruptedException
猜你喜欢
  • 1970-01-01
  • 2016-07-09
  • 2012-06-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多