我在c#中编写了一个代码,它从用户那里获取搜索条件并在数据库表中搜索,我在后台工作者的帮助下完成了这个 现在执行时如果我想强行停止线程。 因为如果用户得到结果,他不想再进行搜索
btnStop_Click(object sender, EventArgs e)
{
backgroundWorkerSearch.CancelAsync();
}
on dowork()
if (backgroundWorkerSearch.CancellationPending)
{
e.Cancel = true;
return;
}
上面的代码不起作用
答案 0 :(得分:4)
取消暂挂只会告诉DoWork方法,起始线程希望它中止。它不会自动停止任何事情。请参阅DoWork方法的示例:
private void DoWork(object sender, DoWorkEventArgs e){
foreach( ... )
{
//do some work
if( myBackgroundWorker.CancellationPending )
{
return;
}
}
}
另一种可能性(你的情况就是这样)
private void DoWork(object sender, DoWorkEventArgs e){
//perform a big task towards the database here
}
最后一个案例没有给你任何检查取消请求的入口点,所以ony选项是找到线程并杀死它而不给它机会以良好的方式关闭,并且不是推荐的模式
最好的办法是将DoWork中的工作分成几批,并检查每个子任务之间的取消请求。