Я пытаюсь написать запрос LINQ, который поддерживал бы отмену, используя механизм CancellationToken
, который предоставляется в платформе .NET. Однако неясно, каким будет правильный способ комбинирования отмены и LINQ.
С PLINQ можно написать:
var resultSequence = sourceSequence.AsParallel()
.WithCancellation(cancellationToken)
.Select(myExpensiveProjectionFunction)
.ToList();
К сожалению, WithCancellation ()
применяется только к ParallelEnumerable
- поэтому его нельзя использовать с обычным старым запросом LINQ. Конечно, можно использовать WithDegreeOfParallelism (1)
, чтобы превратить параллельный запрос в последовательный, но это явно уловка:
var resultSequence = sourceSequence.AsParallel()
.WithDegreeOfParallelism(1)
.WithCancellation(cancellationToken)
.Select(myExpensiveProjectionFunction)
.ToList();
Я также хотел бы избежать создания отдельного Задача
для этой операции, так как мне нужно сделать это в нескольких местах, и мне нужно иметь возможность контролировать, в каком потоке выполняется этот код в некоторых случаях.
Итак, если не считать написания моей собственной реализации ] WithCancellation ()
- есть ли альтернатива, которая могла бы добиться того же?