Правильный способ использования LINQ с CancellationToken

Я пытаюсь написать запрос 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 () - есть ли альтернатива, которая могла бы добиться того же?

10
задан LBushkin 14 July 2011 в 21:28
поделиться