"Цепочка" задач, создаваемых вызовом асинхронной функции. Каждая задача ждёт (await) вызова TaskCompletionSource.SetResult предыдущей задачей.
Возобновление выполнения после await происходит внутри вызова SetResult, что приводит к эффекту рекурсии. Использование await Task.Yield() позволяет устранить этот эффект.
Программа демонстрирует влияние await Task.Yield() на последовательность выполнения асинхронного обработчика нажатия кнопки.
Несколько задач, создаваемых вызовом асинхронной функции, ждут вызова SetResult одного объекта TaskCompletionSource.
Возобновление выполнения всех задач происходит последовательно внутри вызова SetResult (вместо параллельного выполнения задач в пуле потоков).
При использовании await Task.Yield() "параллельность" восстанавливается. Однако, если увеличить количество задач, то не все они разблокируются одновременно. Возобновление после await Task.Yield() может происходить с существенной задержкой.