TGViewer
Библиотека шарписта | C#, F#, .NET, ASP.NET Библиотека шарписта | C#, F#, .NET, ASP.NET @csharpproglib · 21.6K subscribers
Post #4842 6.49K
🤔 Как отменить задачу с несколькими источниками CancellationToken в C#: заметки от Steven Giesel

Представьте, что у вас есть долго выполняемая задача, которую вы хотите завершить корректно (или нет) и при этом вам нужно отслеживать сигналы отмены из нескольких источников.

Это может быть часто встречающимся кейсом в реализации BackgroundService или IHostedService, где вы хотите отслеживать событие IHostApplicationLifetime.ApplicationStopping и также какое-то другое событие/условие.


var hostToken = IHostApplicationLifetime.ApplicationStopping;

// Какой-то другой источник для отмены, передаваемый методом
var otherToken = ...;


Теперь вы хотите создать CancellationToken, который будет активирован при отмене любого из токенов. Но метод обычно принимает только один токен:


await Task.Delay(Timeout.Infinite, token); // Вы не можете передать два токена здесь


📌 Решение

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


using var linkedTokenSource = CancellationTokenSource.CreateLinkedTokenSource(hostToken, otherToken);
var linkedToken = linkedTokenSource.Token;

await Task.Delay(Timeout.Infinite, linkedToken); // Теперь вы можете передать связанный токен


Учтите, что CancellationTokenSource является IDisposable и должен быть утилизирован, когда вы закончите работать с ним.

Вы также можете отменить связанный источник токенов вручную, чтобы указать, что задача должна быть отменена. «Исходные» токены останутся неизменными, будет отменен только связанный токен.


using var t1 = new CancellationTokenSource();
using var t2 = new CancellationTokenSource();
using var t3 = CancellationTokenSource.CreateLinkedTokenSource(t1.Token, t2.Token);

t3.Cancel();

Console.WriteLine(t1.IsCancellationRequested); // False
Console.WriteLine(t2.IsCancellationRequested); // False
Console.WriteLine(t3.IsCancellationRequested); // True
Steven-Giesel Cancel WhenAny - linked CancellationTokenSource In today's short post, I will show you how to cancel a Task with multiple inputs (aka multiple CancellationTokens) using CancellationTokenSource and CancellationTokenSource.CreateLinkedTokenSource.
  • 👍 39
  • ❤ 2
More from @csharpproglib
  1. Oct 17, 2026⚙️ PeriodicTimer: следующий тик не обязан ждать конца работы Нужно регулярно обновлять дан…
  2. Oct 16, 2026⚙️ Task.WhenAll не ограничивает число запросов Если передать в Task.WhenAll тысячу задач о…
  3. Oct 15, 2026🧑‍💻 Какие навыки помогают вам в разработке в 2026 году? Что вы чаще используете в работе…
  4. Oct 15, 2026🧩 Mapperly: маппинг DTO, который можно открыть и прочитать Вручную перекладывать двадцать…
  5. Oct 14, 2026Post #7290
  6. Oct 14, 2026Общая папка для работы Claude Code и Codex Луи-Франсуа Бушар собрал заметки, инструкции-ск…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →