Phase 21 of 30 · Topic 21.3

Cancellation Pipelines: `CancellationTokenSource`, Timeouts & Linked Tokens

1Concept

Cancellation in .NET is cooperative. `CancellationTokenSource.CreateLinkedTokenSource` combines multiple tokens (e.g. user abort + 5s timeout) into a single unified cancellation trigger.

2Architecture Diagram

[ User Request Token ] ──┐
                          ├──> [ Linked Token Source ] ──> Triggers if EITHER cancels!
[ 5-Second Timeout ]   ──┘

3Code Example

C# 13 & .NET 9
using System;
using System.Threading;
using System.Threading.Tasks;

public class CancellationDemo
{
    public static async Task ExecuteOperationAsync(CancellationToken ct)
    {
        for (int i = 1; i <= 10; i++)
        {
            ct.ThrowIfCancellationRequested(); // Cooperative check
            Console.WriteLine($"Step {i} executed.");
            await Task.Delay(20, ct);
        }
    }

    public static async Task Main()
    {
        // Auto-cancel after 50ms timeout
        using var cts = new CancellationTokenSource(TimeSpan.FromMilliseconds(50));

        try
        {
            await ExecuteOperationAsync(cts.Token);
        }
        catch (OperationCanceledException)
        {
            Console.WriteLine("Operation safely cancelled via timeout.");
        }
    }
}

4Expected Output

Step 1 executed.
Step 2 executed.
Operation safely cancelled via timeout.

5Key Takeaways

  • Always forward `CancellationToken` to downstream async APIs.
  • Use `cts.CancelAfter(TimeSpan)` for timeout enforcement.
  • Catch `OperationCanceledException` to handle expected aborts gracefully.