Тайм-ауты обрабатываются в асинхронных рабочих процессах через отмены.Что происходит в вашем сценарии с блокирующим ожиданием, так это то, что первый возможный момент для проверки отмены наступает после завершения ожидания.
В асинхронных рабочих процессах используется модель, называемая кооперативным аннулированием, что означает, что вызывающий и вызываемый абоненты взаимодействуют при обработке аннулирования через посредника CancellationToken
.Когда Async.StartChild
необходимо отменить дочерний рабочий процесс, он запросит отмену на токене, а затем он перейдет к дочернему рабочему процессу, чтобы проверить состояние токена отмены и вызвать продолжение отмены.Эти проверки запекаются в асинхронных примитивах, ищите IsCancellationRequested
здесь .
Поскольку ваш дочерний рабочий процесс заблокирован на Thread.Sleep
, этого не произойдет, пока не будет завершен сон.
Стоит отметить, что та же модель используется в задачах TPL.Вы просто не видите его, потому что время ожидания вашей задачи зависит от семантики Task.WhenAny
- и это может быть не того, что вы ожидаете относительно оставшихся запущенных задач.