繁体   English   中英

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

[英]Cancelling long-running tasks in PLINQ

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

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

我想我缺少明显的东西..在此先感谢您的见解。

此外,这似乎仍不能阻止执行很长的查询。 这甚至是取消长时间运行的查询后被触发的正确方法吗?

修改后的代码:

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");
  }   

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

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

这只是一个猜测:查询不是惰性的(就像在普通LINQ中一样),因此直到以后才执行,这不是问题吗?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM