1

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

2 に答える 2

1

PLINQ は、いくつかの要素ごとにキャンセル トークンをポーリングします。アプリケーションのチェック頻度が不十分な場合は、PLINQ クエリ内のすべての高価なデリゲートが定期的に cts.Token.ThrowIfCancellationRequested() を呼び出すようにしてください。

詳細については、次の記事を参照してください: http://blogs.msdn.com/b/pfxteam/archive/2009/06/22/9791840.aspx

于 2010-07-20T04:42:54.243 に答える
0

これは単なる推測です。クエリが (通常の LINQ のように) 遅延しているため、後で実行されるまで実行されないことが問題ではないでしょうか?

于 2010-07-19T22:53:00.040 に答える