Отмена длительных задач в PLINQ - PullRequest
2 голосов
/ 20 июля 2010

Я пытаюсь использовать библиотеку параллельных задач 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");
  }   

Ответы [ 2 ]

1 голос
/ 20 июля 2010

PLINQ будет опрашивать токен отмены после каждого определенного числа элементов.Если частота проверок недостаточна для вашего приложения, убедитесь, что все дорогие делегаты в запросе PLINQ регулярно вызывают cts.Token.ThrowIfCancellationRequested ().

Подробнее см. В этой статье: http://blogs.msdn.com/b/pfxteam/archive/2009/06/22/9791840.aspx

0 голосов
/ 20 июля 2010

Это всего лишь предположение: проблема не в том, что запрос ленив (как в обычном LINQ), и поэтому он не выполняется до позже?

...