csharp-async について
C# の非同期コードを作成またはレビューする開発者向けのベストプラクティススキルです。タスクの戻り値、例外処理、性能、キャンセル、ブロッキングの落とし穴を扱います。
主な機能
- 01非同期メソッドの命名規則
- 02Task と ValueTask の戻り値指針
- 03例外とキャンセルの処理
- 04並列タスクとタイムアウトのパターン
- 05ブロッキングを伴う非同期コードへの注意
活用シーン
- 01C# 非同期メソッドのレビュー
- 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 メソッドを作成しないでください(イベントハンドラーを除く)
- Task を返すメソッドは常に await します
実装パターン
- 長時間実行される操作には非同期コマンドパターンを実装します
- シーケンスを非同期的に処理するには非同期ストリーム(IAsyncEnumerable)を使用します
- パブリック API にはタスクベースの非同期パターン(TAP)を検討します
私の C# コードをレビューする際は、これらの問題を特定し、これらのベストプラクティスに従った改善を提案してください。
コメント
Markdown 対応