Я пытаюсь использовать параллельную библиотеку задач 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");
}
может быть, я misparsing, но это, кажется, как вы распараллеливания слишком низко - вы хотите (если я понимание кода) делать распараллеливание в вызывающем коде, чтобы вы запускали X разных запросов getSearchResults параллельно, вместо того, чтобы делать это в методе getSearchResults, так как вы пытаетесь AsParallel после (предположительно последовательной) операции myLongSearchQuery –
Я переместил мой параллелизм по цепочке. но длинные запросы по-прежнему не отменены. Не должно ли это работать концептуально? –
Когда вы отменяете текущие потоки, разрешается прекращать работу, отмена просто прекращает запуск новых потоков. – CityView