← Back to list

handling-async-operations
by christian289
ClaudeCode와 함께하는 .NET 개발 튜토리얼
⭐ 1🍴 0📅 Jan 25, 2026
SKILL.md
name: handling-async-operations description: "Implements asynchronous programming patterns using Task, ValueTask, and ConfigureAwait in .NET. Use when building non-blocking I/O operations or improving application responsiveness."
.NET Asynchronous Programming
A guide for APIs and patterns for efficient asynchronous programming.
Quick Reference: See QUICKREF.md for essential patterns at a glance.
1. Core APIs
| API | Purpose |
|---|---|
Task | Async operation (no return value) |
Task<T> | Async operation (with return value) |
ValueTask<T> | Optimization for high-frequency calls |
IAsyncEnumerable<T> | Async streams |
2. Task vs ValueTask
2.1 When to Use Task
- Most async operations
- When actual async work always occurs
2.2 When to Use ValueTask
- When synchronous completion is frequent (cache hits)
- High-frequency call methods
// Use ValueTask when cache hits are frequent
public ValueTask<Data> GetDataAsync(string key)
{
if (_cache.TryGetValue(key, out var cached))
{
// Synchronous return (no Heap allocation)
return new ValueTask<Data>(cached);
}
// When async work is needed
return new ValueTask<Data>(LoadFromDbAsync(key));
}
2.3 ValueTask Cautions
// ❌ Bad example: Awaiting ValueTask multiple times
var task = GetDataAsync("key");
var result1 = await task;
var result2 = await task; // May cause error!
// ✅ Good example: Await only once
var result = await GetDataAsync("key");
3. ConfigureAwait
// Use ConfigureAwait(false) in libraries
public async Task<string> FetchDataAsync()
{
var response = await _httpClient.GetAsync(url)
.ConfigureAwait(false);
return await response.Content.ReadAsStringAsync()
.ConfigureAwait(false);
}
4. Async Streams (IAsyncEnumerable)
public async IAsyncEnumerable<Data> GetDataStreamAsync(
[EnumeratorCancellation] CancellationToken ct = default)
{
await foreach (var item in _source.ReadAllAsync(ct))
{
yield return await ProcessAsync(item);
}
}
// Consuming
await foreach (var data in GetDataStreamAsync(ct))
{
Console.WriteLine(data);
}
5. Cancellation Token
public async Task<Data> LoadDataAsync(CancellationToken ct = default)
{
ct.ThrowIfCancellationRequested();
return await _httpClient.GetFromJsonAsync<Data>(url, ct);
}
// Setting timeout
using var cts = new CancellationTokenSource(TimeSpan.FromSeconds(30));
await LongRunningOperationAsync(cts.Token);
6. Concurrency Control
private readonly SemaphoreSlim _semaphore = new(maxCount: 10);
public async Task ProcessWithThrottlingAsync(Data data)
{
await _semaphore.WaitAsync();
try
{
await ProcessAsync(data);
}
finally
{
_semaphore.Release();
}
}
7. Anti-patterns
// ❌ No async void (cannot handle exceptions)
public async void BadMethod() { }
// ✅ async Task
public async Task GoodMethod() { }
// ❌ No .Result, .Wait() (deadlock risk)
var result = GetDataAsync().Result;
// ✅ Use await
var result = await GetDataAsync();
// ❌ Unnecessary async/await
public async Task<Data> GetDataAsync()
{
return await _repository.GetAsync();
}
// ✅ Direct return
public Task<Data> GetDataAsync()
{
return _repository.GetAsync();
}
8. References
Score
Total Score
65/100
Based on repository quality metrics
✓SKILL.md
SKILL.mdファイルが含まれている
+20
✓LICENSE
ライセンスが設定されている
+10
○説明文
100文字以上の説明がある
0/10
○人気
GitHub Stars 100以上
0/15
✓最近の活動
1ヶ月以内に更新
+10
○フォーク
10回以上フォークされている
0/5
✓Issue管理
オープンIssueが50未満
+5
✓言語
プログラミング言語が設定されている
+5
✓タグ
1つ以上のタグが設定されている
+5
Reviews
💬
Reviews coming soon
