NET 4.0 並列タスク ライブラリを使用して、複数の FTS クエリを処理しようとしています。クエリに時間がかかりすぎる場合は、キャンセルして残りの処理を続行したいと考えています。
このコードは、1 つのクエリがしきい値を超えても停止しません。単一のトランザクションではなく、プロセス全体でキャンセルタスクと制限時間に到達するように呼び出していると思います。期間を非常に短く (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");
}