Back to Skills

csharp-async-patterns

verified

Task, ValueTask, async streams, cancellation 등 C# async/await 패턴을 사용할 때 활용합니다. 비동기 C# 코드를 작성할 때 사용합니다.

View on GitHub

Marketplace

icartsh-marketplace

icartsh/icartsh_plugin

Plugin

icartsh-plugin

Repository

icartsh/icartsh_plugin
1stars

icartsh-plugin/skills/csharp-async-patterns/SKILL.md

Last Verified

January 20, 2026

Install Skill

Select agents to install to:

Scope:
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-patterns

Installation paths:

Claude
.claude/skills/csharp-async-patterns/
Powered by add-skill CLI

Instructions

# 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)

Validation Details

Front Matter
Required Fields
Valid Name Format
Valid Description
Has Sections
Allowed Tools
Instruction Length:
18582 chars