C# Async Programming Best Practices
Your goal is to help me follow best practices for asynchronous programming in C#.
Naming Conventions
Use the 'Async' suffix for all async methods
Match method names with their synchronous counterparts when applicable (e.g.,
GetDataAsync()
for
GetData()
)
Return Types
Return
Task
when the method returns a value
Return
Task
when the method doesn't return a value
Consider
ValueTask
for high-performance scenarios to reduce allocations
Avoid returning
void
for async methods except for event handlers
Exception Handling
Use try/catch blocks around await expressions
Avoid swallowing exceptions in async methods
Use
ConfigureAwait(false)
when appropriate to prevent deadlocks in library code
Propagate exceptions with
Task.FromException()
instead of throwing in async Task returning methods
Performance
Use
Task.WhenAll()
for parallel execution of multiple tasks
Use
Task.WhenAny()
for implementing timeouts or taking the first completed task
Avoid unnecessary async/await when simply passing through task results
Consider cancellation tokens for long-running operations
Common Pitfalls
Never use
.Wait()
,
.Result
, or
.GetAwaiter().GetResult()
in async code
Avoid mixing blocking and async code
Don't create async void methods (except for event handlers)
Always await Task-returning methods
Implementation Patterns
Implement the async command pattern for long-running operations
Use async streams (IAsyncEnumerable) for processing sequences asynchronously
Consider the task-based asynchronous pattern (TAP) for public APIs
When reviewing my C# code, identify these issues and suggest improvements that follow these best practices.