자바스크립트를 허용해주세요.
[ 자바스크립트 활성화 방법 ]
from Mohon Aktifkan Javascript!
 

[C#] 17장 비동기 프로그래밍 - async/await

728x90

✅ 1. 비동기 프로그래밍이란?

동기(Synchronous)는 코드가 순서대로 실행하는 방식, 비동기(Asynchronous)는 시간이 걸리는 작업을 기다리지 않고 다른 일을 동시에 수행할 수 있는 방식입니다. 예를 들어, 파일을 읽거나, 네트워크에 요청, DB를 조회하는 등 시간이 걸리는 작업을 할 시 비동기로 처리하며 UI 멈추지 않고 부드럽게 동작할 수 있습니다.

using System;
using System.Threading.Tasks;

class Program
{
    static async Task Main(string[] args)
    {
        Console.WriteLine("작업 시작");
        await Task.Delay(1000); // 1초 대기 (비동기)
        Console.WriteLine("작업 완료");
    }
}

✅ 2. async 와 await 키워드

async는 메서드가 비동기 작업을 수행하는 것을 표시하는 방식으로 반드시 Task또는 Task<T>를 반환하거나 void를 반환해야된니다. void는 주로 이벤트 처리에서만 사용됩니다. await는 비동기 작업이 끝날 때까지 기다리며 await를 사용하면 메서드가 멈추는 것처럼 보여도 실제로 다른 작업을 처리할 수 있습니다.

using System;
using System.Threading.Tasks;

public class Program
{
    public static async Task<int> GetNumberAsync()
    {
        await Task.Delay(1000); // 1초 대기 (비동기)
        return 42;
    }

    public static async Task ExampleAsync()
    {
        Console.WriteLine("작업 시작");
        int result = await GetNumberAsync(); // 이곳에서 비동기 대기
        Console.WriteLine($"결과: {result}");
    }

    public static async Task Main()
    {
        await ExampleAsync();
    }
}
  • "작업 시작" 출력
  • 1초 동안 대기 (다른 작업 가능)
  • "결과: 42" 출력

✅ 3. Task, Task<T>, ValueTask 차이

타입 용도
Task 반환값 없는 비동기 작업
Task<T> 반환값이 있는 비동기 작업
ValueTask<T> 성능 최적화용, 반환값이 있는 비동기 작업에서 Task 객체 할당 최소화
using System;
using System.Threading.Tasks;

public class Program
{ 
  // Task<T> 사용 
  public static async Task<int> ComputeTaskAsync()
  {
        await Task.Delay(500); // 비동기 대기
        return 100;
  }
  
  // ValueTask<T> 사용 
  public static async ValueTask<int> ComputeValueTaskAsync(bool quick)
  {
        if (quick)
            return 50; // 즉시 완료되는 값
        await Task.Delay(500);
        return 150;
  }

  public static async Task Main()
  {
        int taskResult = await ComputeTaskAsync();
        Console.WriteLine($"Task 결과: {taskResult}");

        int valueTaskResult = await ComputeValueTaskAsync(true);
        Console.WriteLine($"valueTask 결과: {valueTaskResult}");
  }
   
}

✅ 4. HTTP 요청 예제

using System;
using System.Net.Http;
using System.Threading.Tasks;

public class Program
{
    public static async Task Main()
    {
        HttpClient client = new HttpClient();
        string result = await client.GetStringAsync("https://example.com/");
        Console.WriteLine(result.Substring(0, 100)); // 처음 100 글자 출력
    }
}

✅ 주의 사항

  • UI 스레드에서 오래 걸리는 작업은 무조건 비동기로 처리
  • WPF, WinForms, Blazor 등 UI 스레드를 막으면 앱이 멈춤
  • async void는 이벤트 핸들러 외에는 피하기, 예외 처리가 어렵고 호출자가 기다릴 수 ❌
using System;
using System.Threading.Tasks;

public class Program
{
    public static async Task<int> GetNumberAsync()
    {
        await Task.Delay(1000);
        return 42;
    }

    public static async Task Main()
    {
        Task<int> t1 = GetNumberAsync();
        Task<int> t2 = GetNumberAsync();

        int[] results = await Task.WhenAll(t1, t2);
        Console.WriteLine($"결과: {results[0]}, {results[1]}");
    }
}

 

 

GitHub - Koras02/Csharp-posting: https://thinky.tistory.com/category/%EA%B2%8C%EC%9E%84%20%EB%AA%A8%EB%94%A9/C%23

https://thinky.tistory.com/category/%EA%B2%8C%EC%9E%84%20%EB%AA%A8%EB%94%A9/C%23 - Koras02/Csharp-posting

github.com

 

728x90
LIST

'게임 모딩 > C#' 카테고리의 다른 글

[C#] 16장 패턴일치 심화  (0) 2025.09.10
[C#] 15장 제네릭 심화  (0) 2025.09.05
[C#] 14장 LINQ 기본 -> 고급쿼리  (2) 2025.08.31
[C#] 13장 C# 람다식과 Func  (0) 2025.08.24
[C#] 12장 C# 델리게이트와 이벤트  (0) 2025.08.20