본문 바로가기
728x90
반응형

Task6

[궁금시리즈] 5-9. Task.WhenAll()과 Task.WhenAny()는 언제 사용할까? 다음 코드를 보자.await DownloadFileAsync("A");await DownloadFileAsync("B");await DownloadFileAsync("C"); 언뜻 보면 세 개의 다운로드가 동시에 진행될 것처럼 보인다. 하지만 실제 실행 순서는 다음과 같다.A 다운로드↓완료↓B 다운로드↓완료↓C 다운로드 즉,앞 작업이 끝나야 다음 작업이 시작된다.만약 서로 독립적인 작업이라면동시에 실행하는 것이 훨씬 효율적이다.Task를 먼저 생성하면 어떻게 될까?다음 코드를 보자.Task taskA = DownloadFileAsync("A");Task taskB = DownloadFileAsync("B");Task taskC = DownloadFileAsync("C");await taskA;await .. 2026. 7. 21.
[궁금시리즈] 5-8. async void를 사용하면 안 되는 이유 다음 두 메서드를 보자.public async Task SaveAsync(){ await Task.Delay(1000);} 그리고public async void SaveAsync(){ await Task.Delay(1000);} 둘 다 컴파일된다.둘 다 await도 사용할 수 있다. 그렇다면 둘은 무엇이 다를까?많은 초보 개발자는반환형만 다를 뿐 같은 기능이다. 라고 생각한다. 하지만 실제로는동작 방식이 완전히 다르다. 이번 글에서는 왜 async void가 대부분의 상황에서 권장되지 않는지 알아보자.먼저 Task를 떠올려 보자앞에서 살펴본 것처럼Task는 작업 하나를 나타내는 객체이다.Task task = SaveAsync(); Task가 있으므로await task; 도 할 수 있고Task... 2026. 7. 21.
[궁금시리즈] 5-7. CPU Bound와 I/O Bound는 무엇이 다를까? 비동기 프로그래밍을 공부하다 보면 자주 등장하는 용어가 있다.바로 CPU Bound와 I/O Bound이다.처음에는 단순히CPU 작업입출력 작업정도로 이해하기 쉽다. 하지만 실제로는어떤 작업인지에 따라 비동기 처리 방식이 완전히 달라진다.이번 글에서는 CPU Bound와 I/O Bound의 차이와 각각 어떤 방식으로 처리해야 하는지 알아보자.CPU Bound란?CPU Bound는CPU가 계속 계산해야 하는 작업이다. 예를 들어for (int i = 0; i CPU는계산↓계산↓계산↓계산 처럼쉬지 않고 연산을 수행한다.즉,CPU 성능이작업 속도를 결정한다.대표적인 CPU Bound 작업은이미지 처리영상 인코딩데이터 압축AI 계산암호화대량의 수학 연산물리 계산 등이 있다.I/O Bound란?반대로I/O Bo.. 2026. 7. 21.
[궁금시리즈] 5-6. Task.Run()은 언제 사용해야 할까? 비동기 코드를 작성하다 보면 다음과 같은 코드를 자주 보게 된다.await Task.Run(() =>{ DoWork();}); 많은 개발자는"비동기 작업은 모두 Task.Run으로 실행해야 한다." 라고 생각한다. 하지만 실제로는 그렇지 않다.Task.Run()은 모든 비동기 작업을 위한 도구가 아니라 CPU를 많이 사용하는 작업(CPU Bound) 을 다른 스레드에서 실행하기 위한 도구이다. 이번 글에서는 Task.Run()이 왜 존재하는지, 그리고 언제 사용해야 하는지 알아보자.먼저 Task.Run은 무엇일까?다음 코드를 보자.await Task.Run(() =>{ HeavyCalculation();}); Task.Run()은 전달된 작업을 ThreadPool의 스레드에서 실행하도록 예약한.. 2026. 7. 21.
[궁금시리즈] 5-3. async와 await는 내부적으로 어떻게 동작할까? C#에서 비동기 프로그래밍을 시작하면 가장 먼저 배우는 문법이 있다.바로 async와 await이다.public async Task DownloadAsync(){ await Task.Delay(1000); Console.WriteLine("완료");} 코드를 보면 일반적인 순차 실행과 크게 다르지 않다. 하지만 실제로는 메서드가 중간에 멈췄다가, 나중에 다시 이어서 실행된다. 메서드는 어떻게 자신의 실행 위치를 기억할 수 있을까?이번 글에서는 async와 await가 내부적으로 어떻게 동작하는지 살펴보자.await는 스레드를 멈추는 것일까?가장 많이 하는 오해부터 살펴보자. 많은 사람들이await는 현재 스레드를 멈춘다.라고 생각한다. 하지만 그렇지 않다.예를 들어await Task.Delay.. 2026. 7. 21.
[궁금시리즈] 5-2. Task는 무엇이며 왜 등장했을까? 비동기 프로그래밍을 공부하다 보면 가장 먼저 만나게 되는 타입이 있다.바로 Task이다.Task task = DoWorkAsync(); 또는Task task = CalculateAsync(); 거의 모든 비동기 메서드가 Task를 반환한다.그렇다면 Task는 무엇일까?많은 사람들이"Task는 새로운 스레드이다." 라고 생각하지만,실제로는 전혀 다른 개념이다.Task가 등장하기 전에는?초기의 .NET에서는 비동기 작업을 수행하기 위해 직접 Thread를 생성하는 경우가 많았다.Thread thread = new Thread(DoWork);thread.Start(); 또는ThreadPool.QueueUserWorkItem(...); 처럼 작성했다. 이 방식도 동작은 하지만 여러 문제가 있었다.작업 완료 여부.. 2026. 7. 21.
728x90
반응형