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.