我正在尝试使用.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");
}
答案 0 :(得分:1)
PLINQ将在每一些元素之后轮询取消令牌。如果检查的频率不足以满足您的应用,请确保PLINQ查询中的所有昂贵代表定期调用cts.Token.ThrowIfCancellationRequested()。
有关详细信息,请参阅此文章:http://blogs.msdn.com/b/pfxteam/archive/2009/06/22/9791840.aspx
答案 1 :(得分:0)
这只是一个猜测:查询是否是懒惰的问题(正常LINQ中),因此直到稍后才执行?