Хороший способ для CancellationToken повлиять на подмножество задач, управляемых другим CancellationToken

Есть ли способы привязать токен отмены к подмножеству задач, управляемых другим токеном отмены?... в этом примере я создаю два объекта cancellationTokenSource... и регистрирую один в функции отмены другого... таким образом, если я отменить загрузку изображений... это только отменяет эти задачи... но если я отменяю все... это отменяет все задачи... Есть ли лучший способ сделать это? (этот путь кажется грязным... например, когда отменить регистрацию)

CancellationTokenSource CancelAllSource = new CancellationTokenSource();

for (int i = 0; i < 20; i++)
    Task.Factory.StartNew(() => { LoadUrl(i, CancelAllSource.Token); });

CancellationTokenSource CancelImageLoadsSource = new CancellationTokenSource();

// this would connect the cancel all token to the cancel image loads token
CancelAllSource.Token.Register(CancelImageLoadsSource.Cancel, false);

for (int i = 0; i < 10; i++)
    Task.Factory.StartNew(() => { LoadImage(i, CancelImageLoadsSource.Token); });

...

CancelImageLoadsSource.Cancel(); // would cancel only the LoadImage tasks
// or
CancelAllSource.Cancel(); // would cancel all tasks (including the LoadImage tasks)

1 ответ

Решение

Да, есть.

Ты можешь использовать CreateLinkedTokenSource * который создал CancellationTokenSource Вы можете отменить себя, но также будут автоматически отменены, когда токен будет сигнализирован:

var cancelAllSource = new CancellationTokenSource();
var cancelImageLoadsSource = CancellationTokenSource.CreateLinkedTokenSource(cancelAllSource.Token);

Создает CancellationTokenSource, который будет в состоянии отмены, когда любой из исходных токенов в указанном массиве находится в состоянии отмены.

От CancellationTokenSource.CreateLinkedTokenSource


* Если вы посмотрите на реализацию, это не то же самое, но это довольно близко к использованию CancellationToken.Register как вы делаете

Другие вопросы по тегам