이번 포스팅은 C#의 비동기 프로그래밍을 수행하는 데 사용하는 클래스인 Task에 대해 정리하였습니다.
Task는 제가 실제로 작업하면서 많이 쓰는 클래스이며 많은 활용을 할 수 있습니다.
예시 코드들과 함께 Task에 대해 알아보겠습니다.
| Task 이해
- Task는 비동기 작업을 나타내는 클래스입니다. System.Threading.Tasks 네임스페이스에 포함되어 있으며
Task를 사용하면 오래 걸리는 작업이 메인 스레드를 차단하지 않고, 병렬로 실행됩니다.
이는 UI 스레드를 건들지 않고 실행되는 것으로 애플리케이션이 응답하지 않는 현상이 없습니다.
| Task 실행
- Task를 생성하는 가장 간단한 방법은 Task.Run 메서드를 실행하는 것입니다.
Task.Run 메서드는 주어진 작업을 비동기적으로 실행합니다.
예시)
Task task = Task.Run(() =>
{
// 비동기 작업 내용
});
| Task 형태
1. Task<T>
- 이 형태의 작업은 결과를 반환하며 T는 반환되는 결과의 타입입니다.
예시) Task<int>를 생성하고 결과를 출력
Task<int> task = Task.Run(() =>
{
int result = 0;
for (int i = 0; i < 100; i++)
{
result += i;
}
return result;
});
Console.WriteLine(task.Result);
2. Task
- 이 형태는 결과를 반환하지 않습니다.
예시) Task를 사용하여 앞 예시와 같은 동작 수행
Task task = Task.Run(() =>
{
for (int i = 0; i < 100; i++)
{
Console.WriteLine("*");
}
});
| Task 상태와 완료 여부 확인
- Task는 여러 가지 상태를 가질 수 있습니다.
Task.Status 속성을 사용하여 Task 현재 상태를 확인할 수 있으며
이를 조건문으로 활용하여 Task를 이용한 다양한 시나리오를 구성할 수 있습니다.
주요 상태 :
- Created: Task가 생성되었지만 실행되지 않은 상태
- Running: Task가 현재 실행 중인 상태
- RanToCompletion: Task가 성공적으로 완료된 상태
- Canceled: Task가 취소된 상태
- Faulted: Task가 예외로 인해 완료되지 못한 상태
그리고 Task.IsCompleted 속성을 통해 Task가 완료되었는지 여부를 bool 형태로 확인할 수 있습니다.
| Task의 예외 처리
- Task에서 발생하는 예외는 Task에서 직접 처리되지 않습니다.
따라서 Task를 기다리는 코드에서 예외를 catch 해야 합니다.
Task.Wait() 메서드를 사용하여 Task가 완료될 때까지 대기하여, 발생한 예외를 catch 할 수 있습니다.
예시) Task.Wati() 메서드를 이용한 Task 예외 처리
try
{
task.Wait();
}
catch (AggregateException ae)
{
// 예외 처리 로직
}
| 여러 Task 동시 실행
- 여러 개의 Task를 동시에 실행하고, 모든 Task의 완료를 기다리려면 Task.WhenAll 메서드를 사용할 수 있습니다. Task.WhenAll 메서드는 모든 Task가 완료될 때까지 대기하는 Task를 반환합니다.
예시) Task.WhenAll 사용하여 여러 Task 동시 실행
Task task1 = Task.Run(() => { /* 비동기 작업 내용 */ });
Task task2 = Task.Run(() => { /* 비동기 작업 내용 */ });
await Task.WhenAll(task1, task2);
- Task.WhenAll 메서드는 모든 Task가 완료되었을 때만 완료된 Task를 반환합니다.
| 마무리
Task는 제가 실제로 작업하면서 많이 쓰는 클래스이며 많은 활용을 할 수 있습니다.
비동기 작업을 효율적으로 처리하고 병렬 프로그래밍을 활용하는데 매우 유용합니다.
I/O 작업, 통신, DB 작업 등을 비동기적으로 처리하는데 사용하고 있습니다.
이제 C#의 Task에 대해 더 깊이 이해하셨으니
Task를 활용하여 비동기 작업을 효과적으로 처리해 보세요!
틀린 점이나 질문이 있으시면 댓글로 남겨주세요!
다음 포스팅으로 찾아오겠습니다.
감사합니다 :)
'C#' 카테고리의 다른 글
C# 비동기 프로그래밍 : Task의 연속 작업 (Continuations) 이해 (0) | 2023.11.20 |
---|---|
C# 비동기 프로그래밍 : async, await 이해 (0) | 2023.11.17 |
C# 멀티캐스트 이벤트 이해 : 다중 이벤트 핸들러 관리 (0) | 2023.11.02 |
C# 이벤트 정의와 등록 및 제거 방법 (0) | 2023.11.01 |
C# 이벤트 발생 (Event Raising) 이해 (0) | 2023.10.31 |