A Span<T> cannot cross an await boundary

Keep span work between awaits. Carry memory or its backing buffer through asynchronous I/O.

September 29, 2026 · 2 min · Lukas Walter

await foreach does not automatically use your cancellation token

A CancellationToken in scope does nothing unless the async enumeration receives and observes it.

September 6, 2026 · 2 min · Lukas Walter

Use async for I/O, not as a substitute for CPU parallelism

Use async to avoid blocking while I/O is in flight, and treat CPU parallelism as a separate measured design decision.

July 28, 2026 · 3 min · Lukas Walter

Use ValueTask only when you know why

Prefer Task unless you have a measured allocation reason and a simple consumption contract.

July 11, 2026 · 2 min · Lukas Walter

Do not hide exceptions inside fire-and-forget tasks

If work can fail, give it ownership, logging, cancellation, and a lifecycle.

July 5, 2026 · 2 min · Lukas Walter

Start independent tasks before awaiting them

Create unrelated asynchronous operations first, then await them together.

July 5, 2026 · 2 min · Lukas Walter