using System.Threading.Tasks;
static async Task Main(string[] args)
var innerLoopToken = new CancellationTokenSource(TimeSpan.FromSeconds(5)).Token;
var outerLoopToken = new CancellationTokenSource(TimeSpan.FromSeconds(10)).Token;
Console.WriteLine($"Outer Loop pre: {counter}");
if(innerLoopToken.IsCancellationRequested)
Console.WriteLine($"The inner loop token was cancelled, so exiting outer loop");
await InnerLoopAsync(innerLoopToken);
if(!innerLoopToken.IsCancellationRequested)
Console.WriteLine("I will never be called! Inner loop is still running, but the outer loop got control back!");
Console.WriteLine($"Outer Loop pst: {counter++}");
Console.WriteLine($"After cancelling inner and outer loops counter is at: '{counter}'. Which is not greater than 1. Which means outer loop was blocked until inner completed!");
static async Task InnerLoopAsync(CancellationToken token)
using var timer = new PeriodicTimer(TimeSpan.FromSeconds(1));
while (await timer.WaitForNextTickAsync())
Console.WriteLine($"Inner Loop pre: {counter}");
Console.WriteLine($"Inner Loop post: {counter++}");
if (token.IsCancellationRequested)
Console.WriteLine("Inner Loop stopping due to cancellation token");
static async Task DoSomeAsyncWork()
Console.WriteLine("Doing Some Async Work");
await Task.Run(() => Task.Delay(1000));
Console.WriteLine("Done doing Some Async Work!");