Почему CancellationToken действует и на объект Task, которому в параметры конструктора он не передаётся (см. внутри)?

CancellationToken является механизмом, который позволяет отменить выполнение асинхронных операций в C#. Он предоставляет возможность контролировать выполнение задачи и принудительно прерывать ее выполнение, если это необходимо.

Понимание того, как CancellationToken воздействует на объект Task без его передачи в конструкторе, требует некоторого знакомства с внутренними механизмами работы синхронизации в C#.

Когда вы создаете объект Task без CancellationToken в конструкторе, по умолчанию создается объект CancellationToken.None, что означает отсутствие токена отмены. Это означает, что задача будет выполняться до тех пор, пока не завершится сама по себе или не будет явно отменена.

Однако, даже без явной передачи CancellationToken в конструкторе задачи, можно использовать CancellationToken для отмены выполнения задачи. Это возможно благодаря связи между CancellationToken и внутренними механизмами синхронизации, используемыми в C#.

Внутри реализации Task используются различные объекты синхронизации, такие как ManualResetEvent и Monitor. CancellationToken связан с этими объектами синхронизации, и при его вызове происходит сигнализация о необходимости прекратить выполнение задачи. Это происходит при вызове метода Cancel у CancellationToken или при вызове метода ThrowIfCancellationRequested у CancellationTokenSource.

Когда CancellationToken вызывается, объект Task проверяет состояние CancellationToken и реагирует на его изменение. Если CancellationToken отменен, задача прекращает работу, выбрасывая OperationCanceledException. Это исключение будет передано обработчикам задачи перед ее завершением.

Таким образом, CancellationToken воздействует на объект Task, даже если он не передается в конструкторе, благодаря внутренним механизмам синхронизации, используемым в C#. Объект Task внутренне связан с CancellationToken и реагирует на его изменение, для прекращения выполнения задачи, если это необходимо. В результате, вы можете контролировать выполнение задачи, даже если CancellationToken не передается явно в конструкторе.