取消PLINQ中长时间运行的任务

时间:2010-07-19 22:29:35

标签: c# timeout plinq task-parallel-library full-text-search

我正在尝试使用.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");
  }   

2 个答案:

答案 0 :(得分:1)

PLINQ将在每一些元素之后轮询取消令牌。如果检查的频率不足以满足您的应用,请确保PLINQ查询中的所有昂贵代表定期调用cts.Token.ThrowIfCancellationRequested()。

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

答案 1 :(得分:0)

这只是一个猜测:查询是否是懒惰的问题(正常LINQ中),因此直到稍后才执行?