Skillshub csharp-async

Get best practices for C# async programming

install
source · Clone the upstream repo
git clone https://github.com/ComeOnOliver/skillshub
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/ComeOnOliver/skillshub "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/github/awesome-copilot/csharp-async" ~/.claude/skills/comeonoliver-skillshub-csharp-async && rm -rf "$T"
manifest: skills/github/awesome-copilot/csharp-async/SKILL.md
source content

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<T>
    when the method returns a value
  • Return
    Task
    when the method doesn't return a value
  • Consider
    ValueTask<T>
    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<T>) 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.