PLINQ ForAll WithCancellation не работаетC#

Место общения программистов C#
Ответить
Anonymous
 PLINQ ForAll WithCancellation не работает

Сообщение Anonymous »

Я написал запрос PLINQ, который заканчивается оператором ForAll, и использовал оператор WithCancellation, чтобы отменить запрос на полпути. Удивительно, но запрос не отменен. Вот минимальная демонстрация такого поведения:

Код: Выделить всё

CancellationTokenSource cts = new CancellationTokenSource(1000);
cts.Token.Register(() => Console.WriteLine("--Token Canceled"));

try
{
Enumerable.Range(1, 20)
.AsParallel()
.WithDegreeOfParallelism(2)
.WithCancellation(cts.Token)
.ForAll(x =>
{
Console.WriteLine($"Processing item #{x}");
Thread.Sleep(200);
//cts.Token.ThrowIfCancellationRequested();
});
Console.WriteLine($"The query was completed successfully");
}
catch (OperationCanceledException)
{
Console.WriteLine($"The query was canceled");
}
Онлайн-демо.
Вывод (нежелательно):

Код: Выделить всё

Processing item #1
Processing item #2
Processing item #4
Processing item #3
Processing item #5
Processing item #6
Processing item #8
Processing item #7
Processing item #10
Processing item #9
--Token Canceled
Processing item #11
Processing item #12
Processing item #13
Processing item #14
Processing item #15
Processing item #16
Processing item #17
Processing item #19
Processing item #20
Processing item #18
The query was canceled
Запрос завершается с исключением OperationCanceledException, но не раньше, чем будут обработаны все 20 элементов. Желаемое поведение проявляется, когда я раскомментирую строку cts.Token.ThrowIfCancellationRequested();.
Вывод (желательно):

Код: Выделить всё

Processing item #2
Processing item #1
Processing item #3
Processing item #4
Processing item #5
Processing item #6
Processing item #7
Processing item #8
Processing item #9
Processing item #10
--Token Canceled
The query was canceled
Я делаю что-то не так, или это особенность поведения ForAll+

Код: Выделить всё

WithCancellation
комбинация? Или это ошибка в библиотеке PLINQ?


Подробнее здесь: https://stackoverflow.com/questions/748 ... ot-working
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»