有可能在c#中杀死(而不是取消)一名后台工作人员吗?
我正在开发一个c#应用程序。我想使用后台工作程序来完成所有繁重的处理,但我希望能够在运行时停止它。我面临的问题是,我可以使用“backgroundWorker1.CancelAsync()”取消它,但它不会立即停止 有什么方法可以立即“杀死”线程吗?是否可以在单击后立即停止线程,而不是等待当前睡眠结束 我的代码:有可能在c#中杀死(而不是取消)一名后台工作人员吗?,c#,backgroundworker,C#,Backgroundworker,我正在开发一个c#应用程序。我想使用后台工作程序来完成所有繁重的处理,但我希望能够在运行时停止它。我面临的问题是,我可以使用“backgroundWorker1.CancelAsync()”取消它,但它不会立即停止 有什么方法可以立即“杀死”线程吗?是否可以在单击后立即停止线程,而不是等待当前睡眠结束 我的代码: private void backgroundWorker1_DoWork(object sender, System.ComponentModel.DoWorkEventAr
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++调用所代替,需要花费相当长的时间来完成,所以我不能添加中间取消检查。谢谢你的回答。谢谢你,我理解了一些与线程取消和堕胎有关的所有问题: