Task, ValueTask, async streams, cancellation 등 C# async/await 패턴을 사용할 때 활용합니다. 비동기 C# 코드를 작성할 때 사용합니다.
View on GitHubicartsh/icartsh_plugin
icartsh-plugin
January 20, 2026
Select agents to install to:
npx add-skill https://github.com/icartsh/icartsh_plugin/blob/main/icartsh-plugin/skills/csharp-async-patterns/SKILL.md -a claude-code --skill csharp-async-patternsInstallation paths:
.claude/skills/csharp-async-patterns/# C# Async Patterns
async/await, Task, ValueTask, async streams 및 cancellation 패턴을 사용하여 C# 비동기 프로그래밍을 마스터합니다. 이 SKILL은 반응성이 뛰어나고 확장이 용이한 애플리케이션을 구축하기 위해 C# 8-12의 모던 비동기 패턴을 다룹니다.
## Async/Await Fundamentals
async/await 패턴은 동기 코드처럼 보이고 동작하는 비동기 코드를 작성하는 간단한 방법을 제공합니다.
### Basic Async Method
```csharp
public async Task<string> FetchDataAsync(string url)
{
using var client = new HttpClient();
string result = await client.GetStringAsync(url);
return result;
}
// 비동기 메서드 호출
public async Task ProcessAsync()
{
string data = await FetchDataAsync("https://api.example.com/data");
Console.WriteLine(data);
}
```
### Async Method Signature Rules
```csharp
// ✅ 올바름 - Task 반환
public async Task ProcessDataAsync()
{
await Task.Delay(1000);
}
// ✅ 올바름 - Task<T> 반환
public async Task<int> CalculateAsync()
{
await Task.Delay(1000);
return 42;
}
// ⚠️ 이벤트 핸들러 전용 - void 반환
public async void Button_Click(object sender, EventArgs e)
{
await ProcessDataAsync();
}
// ❌ 잘못됨 - async가 아니지만 Task 반환
public Task WrongAsync()
{
// async를 사용하거나 Task.FromResult를 사용해야 함
return Task.CompletedTask;
}
```
## Task and Task<T>
Task는 비동기 작업을 나타냅니다. Task<T>는 값을 반환하는 작업을 나타냅니다.
### Creating Tasks
```csharp
// CPU 집약적 작업을 위한 Task.Run
public async Task<int> CalculateSumAsync(int[] numbers)
{
return await Task.Run(() => numbers.Sum());
}
// 이미 계산된 값을 위한 Task.FromResult
public Task<string> GetCachedValueAsync(string key)
{
if (_cache.TryGetValue(key, out var value))
{
return Task.FromResult(value);
}
return FetchFromDatabaseAsync(key);
}
// void 비동기 메서드를 위한 Task.CompletedTask
public Task ProcessIfNeededAsync(bool condition)
{
if (!condition)
{
return Task.CompletedTask;
}
return DoActualWorkAsync();
}
```
### Task Composition
```csharp
public async Task<Result> ProcessOrderAsync(Order order)
{
// 순차적 실행 (Sequential execution)
await ValidateOrderAsync(order);
await ChargePaymentAsync(order)