C#에서 비동기, 병렬 처리하는 방법으로 Task
, Parallel
, async/await
이 있다.
async/await
의 경우 Node.js에서 많이 다뤘기 때문에 익숙하지만 나머지 두 놈은 익숙치 않다.
Task는 비동기 작업을 나타내는 클래스로 C#에서 비동기 작업을 처리하는 주된 방식은 Task
를 사용하는 것이다. Task는 비동기 작업을 추상화한 객체로 작업이 완료될 때 결과를 반환하거나 예외를 처리할 수 잇다. 비동기 메서드에서는 Task
나 Task<T>
를 반환 타입으로 사용한다.
public async Task<string> FetchDataAsync()
{
// 비동기적으로 데이터를 가져오는 작업 (예: 웹 요청)
await Task.Delay(2000); // 예시: 2초 지연
return "데이터 완료!";
}
Task.WhenAll()을 사용하면 비동기 작업을 병렬적으로 실행하고 모든 작업이 완료되면 결과를 반환한다.
Node.js 에서 Promise
와 Promise.all
과 같은 기능인 것 같다.
public async Task RunMultipleTasksAsync()
{
Task task1 = Task.Delay(1000); // 1초 지연
Task task2 = Task.Delay(2000); // 2초 지연
await Task.WhenAll(task1, task2); // 두 작업이 끝날 때까지 기다림
Console.WriteLine("모든 작업 완료");
}
Parallel 클래스는 CPU 집약적인 작업을 병렬로 실행하는데 사용되며 여러 프로세서 코어를 활용해 반복문에서 작업을 병렬로 처리하는 데에 적합하다.
여러스레드에서 병렬로 처리하여 성능을 개선할 수 있다. 따라서 수치 계산이나 데이터 처리, 이미지 처리를 하는 등의 작업에서 성능 향상을 기대할 수 있다.
public void ProcessDataInParallel()
{
// 0부터 9까지 병렬로 작업 처리
Parallel.For(0, 10, i =>
{
Console.WriteLine($"작업 {i} 완료");
Task.Delay(500); // 작업 지연
});
}