1

我正在尝试使用 NET 4.0 并行任务库来处理多个 FTS 查询。如果查询花费了太多时间,我想取消它并继续处理其余的。

当一个查询超过阈值时,此代码不会停止。我想我这样称呼它是为了整个过程而不是单个事务达到取消任务和时间限制。如果我将时间段设置得非常小(300 毫秒),那么所有搜索字符串都会调用它。

我想我错过了一些明显的东西..提前感谢您的任何见解。

此外,这似乎仍然无法阻止非常长的查询执行。这甚至是在触发长时间运行的查询后取消它的正确方法吗?

修改后的代码:

CancellationTokenSource cts = new CancellationTokenSource();
CancellationToken token = cts.Token;

var query = searchString.Values.Select(c =>myLongQuery(c)).AsParallel().AsOrdered()
                                        .Skip(counter * numToProcess).Take(numToProcess).WithCancellation(cts.Token);

  new Thread(() =>
  {
     Thread.Sleep(5000);
     cts.Cancel();
  }).Start();

  try
  {
     List<List<Threads>> results = query.ToList();
     foreach (List<Threads> threads in results)
     {
           // does something with data
     }
  } catch (OperationCanceledException) {
     Console.WriteLine("query took too long");
  }   
4

2 回答 2

1

PLINQ 将在每隔一定数量的元素后轮询取消令牌。如果您的应用程序的检查频率不足,请确保 PLINQ 查询中所有昂贵的委托定期调用 cts.Token.ThrowIfCancellationRequested()。

有关更多详细信息,请参阅这篇文章:http: //blogs.msdn.com/b/pfxteam/archive/2009/06/22/9791840.aspx

于 2010-07-20T04:42:54.243 回答
0

这只是一个猜测:查询是否是惰性的(就像在普通 LINQ 中一样),所以它直到稍后才执行?

于 2010-07-19T22:53:00.040 回答