有可能在c#中杀死(而不是取消)一名后台工作人员吗?

有可能在c#中杀死(而不是取消)一名后台工作人员吗?,c#,backgroundworker,C#,Backgroundworker,我正在开发一个c#应用程序。我想使用后台工作程序来完成所有繁重的处理,但我希望能够在运行时停止它。我面临的问题是,我可以使用“backgroundWorker1.CancelAsync()”取消它,但它不会立即停止 有什么方法可以立即“杀死”线程吗?是否可以在单击后立即停止线程,而不是等待当前睡眠结束 我的代码: private void backgroundWorker1_DoWork(object sender, System.ComponentModel.DoWorkEventAr

我正在开发一个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());
    }
private void backgroundWorker1\u DoWork(对象发送方,System.ComponentModel.DoWorkEventArgs e)
{

对于(int i=1;i取消后台工作需要协同完成。替代方法相当于thread.Abort,这是一个坏主意,原因如下所示

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

此外,如果背景任务在被取消后很短时间内仍然存在,只要它最终能保证在没有副作用的情况下完成,就不一定可怕


请注意,虽然后台工作程序提供诸如进度之类的功能,但更现代的方法是使用和。

取消后台工作需要协同完成。替代方法相当于thread.Abort,由于中列出的所有原因,这是一个坏主意

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

此外,如果背景任务在被取消后很短时间内仍然存在,只要它最终能保证在没有副作用的情况下完成,就不一定可怕


请注意,虽然后台工作程序提供了诸如progress之类的功能,但更现代的方法是使用和。

我们使用取消令牌和合作取消的原因是我们已经从错误的API中吸取了教训,例如
Thread.Abort
——也就是说,如果您知道另一个线程处于安全位置,可以终止它d、 您当然可以在该点插入取消令牌的检查。如果您不知道它处于安全位置,请尝试使用
任务。使用取消延迟
,而不是
线程。睡眠
。杀死线程的方法只有一种:调用该方法。但是,从.NET 5开始,它不再受支持。因此,放弃您的选择梦想着努力打破线程。好的。谢谢你的回答。我将尝试找到一种方便而常规的方法。我们使用取消令牌和合作取消的原因是因为我们已经学到了坏API的教训,例如
thread.Abort
-也就是说,如果你知道另一个线程处于安全的位置,那么如果要终止它,您肯定可以在该点插入取消令牌的检查。如果您不知道它处于安全位置,请尝试使用
任务。使用取消延迟
,而不是
线程。睡眠
。杀死线程的方法只有一种:调用该方法。但是,从.NET 5开始,它不再受支持所以,放弃你的梦想,打破硬线程。好的。谢谢你的回答。我会尝试找到一个方便和传统的方式。确实thth.睡是在那里的例子。实际上,它被替换了一个C++调用,需要相当长的一段时间才能完成,所以我不能添加中间取消检查。谢谢你的答案。多亏了你,我对所有与线程取消和终止相关的问题都有了更好的理解:)实际上,线程是在这个例子中。实际上,它被一个C++调用所代替,需要花费相当长的时间来完成,所以我不能添加中间取消检查。谢谢你的回答。谢谢你,我理解了一些与线程取消和堕胎有关的所有问题: