【发布时间】:2010-07-19 22:29:35
【问题描述】:
我正在尝试使用 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");
}
【问题讨论】:
-
也许我解析错误,但似乎你的并行化太低 - 你想(如果我理解代码)在调用代码中进行并行化,所以你'正在并行运行 X 个不同的 getSearchResults 调用,而不是在 getSearchResults 方法中执行它,因为您在(可能是串行的)myLongSearchQuery 操作之后尝试 AsParallel
-
我将我的并行性提升到了链上.. 但是长查询仍然没有被取消。这不应该在概念上起作用吗?
-
当你取消当前正在运行的线程时允许终止,取消只是停止新线程的启动。
标签: c# timeout plinq task-parallel-library full-text-search