关于 csharp-async
面向编写或审查 C# 异步代码的开发者,汇总异步编程实践。内容涵盖任务返回类型、异常处理、性能、取消机制及常见阻塞问题。
主要功能
- 01异步方法命名约定
- 02Task 与 ValueTask 返回建议
- 03异常与取消处理
- 04并行任务与超时模式
- 05阻塞式异步代码警示
适用场景
- 01审查 C# 异步方法
- 02设计基于任务的公共 API
- 03并发执行相互独立的操作
- 04避免死锁和执行阻塞
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ midudev/ autoskills --skill csharp-async安装后在 Claude Code 中输入/csharp-async确认已加载。
详细介绍
C# 异步编程最佳实践
你的目标是帮助我遵循 C# 中异步编程的最佳实践。
命名约定
- 为所有异步方法使用 'Async' 后缀
- 在适用的情况下,让方法名与其同步对应方法保持一致(例如,为
GetData()使用GetDataAsync())
返回类型
- 当方法返回值时,返回
Task<T> - 当方法不返回值时,返回
Task - 考虑在高性能场景中使用
ValueTask<T>以减少分配 - 避免异步方法返回
void,事件处理程序除外
异常处理
- 在 await 表达式周围使用 try/catch 块
- 避免在异步方法中吞掉异常
- 在适当的情况下使用
ConfigureAwait(false),以防止库代码中的死锁 - 在返回 Task 的异步方法中,使用
Task.FromException()传播异常,而不是直接抛出
性能
- 使用
Task.WhenAll()并行执行多个任务 - 使用
Task.WhenAny()实现超时或获取最先完成的任务 - 当只是传递任务结果时,避免不必要的 async/await
- 为长时间运行的操作考虑取消令牌
常见陷阱
- 永远不要在异步代码中使用
.Wait()、.Result或.GetAwaiter().GetResult() - 避免混用阻塞代码和异步代码
- 不要创建 async void 方法(事件处理程序除外)
- 始终 await 返回 Task 的方法
实现模式
- 针对长时间运行的操作实现异步命令模式
- 使用异步流(IAsyncEnumerable)异步处理序列
- 为公共 API 考虑基于任务的异步模式(TAP)
在审查我的 C# 代码时,识别这些问题,并建议遵循这些最佳实践的改进方案。
评论
支持 Markdown