2010-07-19 4 views
2

Я пытаюсь использовать параллельную библиотеку задач NET 4.0 для обработки нескольких запросов FTS. Если запрос занимает слишком много времени, я хочу отменить его и продолжить работу с обработкой остальных.Отмена длительных задач в PLINQ

Этот код не останавливается, когда один запрос проходит порог. Я думаю, что я называю это так, что задача отмены и ограничение времени достигнуты для всего процесса, а не для отдельной транзакции. Если я установил период времени очень небольшим (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

может быть, я misparsing, но это, кажется, как вы распараллеливания слишком низко - вы хотите (если я понимание кода) делать распараллеливание в вызывающем коде, чтобы вы запускали X разных запросов getSearchResults параллельно, вместо того, чтобы делать это в методе getSearchResults, так как вы пытаетесь AsParallel после (предположительно последовательной) операции myLongSearchQuery –

+0

Я переместил мой параллелизм по цепочке. но длинные запросы по-прежнему не отменены. Не должно ли это работать концептуально? –

+0

Когда вы отменяете текущие потоки, разрешается прекращать работу, отмена просто прекращает запуск новых потоков. – CityView

ответ

0

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

+0

Не уверен, что я понимаю, что вы имеете в виду. Потому что результаты не набраны? Не могли бы вы уточнить? –

+0

Я думаю, что строка 'var results = ...' фактически не выполнит запрос. Он будет выполнен только тогда, когда вы фактически перечислите результаты. – svick

1

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

Для получения более подробной информации, обратитесь к этой статье: http://blogs.msdn.com/b/pfxteam/archive/2009/06/22/9791840.aspx

Смежные вопросы