【问题标题】:Is it possible to kill (not cancel) a backgroundWorker in c#?是否可以在 C# 中杀死(而不是取消)一个 backgroundWorker?
【发布时间】:2021-02-10 14:04:23
【问题描述】:

我正在开发一个 c# 应用程序。我想使用后台工作人员进行所有繁重的处理,但我希望能够在运行时停止它。我面临的问题是我可以使用“backgroundWorker1.CancelAsync()”取消它,但它不会立即停止。

有什么方法可以立即“杀死”线程?是否可以在单击后立即停止线程而不是等待当前睡眠结束?

我的代码:

    private void backgroundWorker1_DoWork(object sender, System.ComponentModel.DoWorkEventArgs e)
    {
        for (int i = 1; i <= 10; i++)
        {
            if (backgroundWorker1.CancellationPending == true)
            {
                e.Cancel = true;
                break;
            }
            else
            {
                System.Threading.Thread.Sleep(5000);
                backgroundWorker1.ReportProgress(i * 10);
            }
        }
    }

    private void backgroundWorker1_ProgressChanged(object sender, System.ComponentModel.ProgressChangedEventArgs e)
    {
        string prog = (e.ProgressPercentage.ToString() + "%");
        Console.WriteLine(prog);
    }

    private void button26_Click(object sender, EventArgs e)
    {
        backgroundWorker1.CancelAsync();
    }

    private void button27_Click(object sender, EventArgs e)
    {
        Console.WriteLine(backgroundWorker1.IsBusy.ToString());
    }

感谢任何帮助我的人^^

【问题讨论】:

  • 我们之所以有取消令牌和合作取消是因为我们已经吸取了诸如Thread.Abort 之类的不良 API 的教训——也就是说,如果您知道另一个线程处于可以终止的安全位置,您肯定可以在该点插入取消令牌的检查。如果您知道它处于安全位置...
  • 尝试使用 Task.Delay 取消而不是 Thread.Sleep
  • 杀死线程只有一种方法:调用Thread.Abort 方法。但是,从 .NET 5 开始不再支持它。所以放弃你的梦想吧。
  • 好的。谢谢您的回答。我会尝试找到一种方便且常规的方法。

标签: c# backgroundworker


【解决方案1】:

取消后台工作需要合作完成。替代方案等效于 thread.Abort,由于this answer 中列出的所有原因,这是一个坏主意。

正确的方法是增加检查取消的频率。或者,如果您正在等待 IO,请使用接受取消令牌的 IO 方法。我假设您使用thread.sleep 的示例仅用于演示目的,否则您可以简单地将其替换为Task.Delay(5000, CancellationToken)

另外,如果后台任务在被取消后还存在很短的时间,这并不一定很糟糕,只要保证最终完成而没有副作用。

请注意,虽然后台工作人员提供进度等信息,但更现代的方法是使用 tasksasync/awaitcancellationToken

【讨论】:

  • 确实,thread.sleep 就是这个例子。实际上,它被一个需要相当长的时间才能完成的 c++ 调用所取代,因此我无法添加中间取消检查。谢谢您的回答。多亏了你,我更好地理解了与线程取消和中止相关的所有问题:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-07-12
  • 1970-01-01
  • 2010-09-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多