【发布时间】: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