停止在数据库中搜索的BackgroundWorker

时间:2011-03-23 06:49:00

标签: c# sql-server

我在c#中编写了一个代码,它从用户那里获取搜索条件并在数据库表中搜索,我在后台工作者的帮助下完成了这个 现在执行时如果我想强行停止线程。 因为如果用户得到结果,他不想再进行搜索

btnStop_Click(object sender, EventArgs e)
{
           backgroundWorkerSearch.CancelAsync();
}

on dowork()
if (backgroundWorkerSearch.CancellationPending)
 {
     e.Cancel = true;
     return;
 }

上面的代码不起作用

1 个答案:

答案 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中的工作分成几批,并检查每个子任务之间的取消请求。