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 |