이번 포스팅은 .NET Framework에서 비동기 작업을 수행하기 위한 디자인 패턴인
Event-based-Asynchronous Pattern(EAP)에 대해 알아보려 합니다.
EAP에 대해 알아보고 실제 코드 예제를 통해 어떻게 사용하는지 알아보겠습니다.
| EAP 이해
Event-based-Asynchronous Pattern(EAP)는 비동기 작업을 수행할 때 사용되는 디자인 패턴입니다.
이 방식은 이벤트와 이벤트 핸들러를 사용하여 비동기 작업의 시작과 완료를 알려줍니다.
| EAP 구성 요소
- 비동기 메서드 : MathodNameAsync 형식의 메서드를 제공해야 합니다. 비동기 작업을 시작하는 메서드입니다.
- 완료 이벤트 : MathodNameCompleted 형식의 이벤트를 제공해야 합니다. 비동기 작업이 완료되었음을 알립니다.
- 진행 상황 이벤트 : ProgressChanged 이벤트를 제공해야 합니다. 비동기 작업의 진행 상황을 보고합니다.
예시) EAP를 사용한 간단한 코드
WebClient webClient = new WebClient();
webClient.DownloadFileCompleted += new AsyncCompletedEventHandler(Completed);
webClient.DownloadProgressChanged += new DownloadProgressChangedEventHandler(ProgressChanged);
webClient.DownloadFileAsync(new Uri(url), @"C:\temp");
void ProgressChanged(object sender, DownloadProgressChangedEventArgs e)
{
Console.WriteLine(e.ProgressPercentage);
}
void Completed(object sender, AsyncCompletedEventArgs e)
{
Console.WriteLine("Download completed!");
}
위 코드는 WebClient 클래스의 DownloadFileAsync 메서드를 사용하여 비동기적으로 다운로드합니다.
DownloadProgressChanged 이벤트와 DownloadFileCompleted 이벤트를 사용하여
다운로드의 진행 상태와 완료 상태를 감지하고 처리합니다.
이렇게 EAP를 사용하면 UI가 멈추지 않고 반응을 유지하면서도 오래 걸리는 작업을 수행할 수 있습니다.
다만, EAP는 이제는 조금 더 간편하고 직관적인 Task-based Asynchronous Pattern(TAP)에 많이 대체되었습니다.
TAP는 async와 await를 사용한 비동기 프로그래밍 방법을 말합니다.
| EAP 사용 코드 예제
예시) SerialPort 클래스를 사용하여 RS232 통신을 비동기적으로 수행
static SerialPort port;
static void Main()
{
port = new SerialPort("COM1", 9600, Parity.None, 8, StopBits.One);
port.DataReceived += new SerialDataReceivedEventHandler(port_DataReceived);
port.Open();
// 비동기로 메시지 보내기
port.WriteLine("Hello, world!");
Console.ReadLine();
}
static void port_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
string message = port.ReadLine();
Console.WriteLine("Message received: " + message);
}
위 코드에서는 SerialPort 객체를 생성하여 RS232 통신을 설정하고,
DataReceivd 이벤트를 사용하여 데이터 수신을 비동기적으로 처리합니다.
비동기 메시지를 송신하는 port.WriteLine 메서드를 호출하면, 메인 스레드는 즉시 다음 코드를 진행하고
메시지 송신은 별도의 스레드에서 비동기적으로 수행하는 코드 예시입니다.
| EAP 사용 시 고려사항
EAP를 사용하면서 고려해야 할 몇 가지 사항들이 있습니다.
- 스레드 관리 : 메인 스레드가 비동기 작업이 완료될 때까지 블로킹되지 않도록 주의해야 합니다.
- 오류 처리 : 비동기 작업 중에 발생하는 오류는 MethodNameCompleted 이벤트 핸들러에서 처리해야 합니다.
- 멀티 스레드 환경에서 동기화 문제 : 여러 작업이 동시에 실행되는 경우 deadlock이 걸리지 않게 고려해야 합니다.
| 마무리
실제로 EAP에서 TAP로 많이 넘어가고 권장되고 있습니다.
async와 await를 C#에서 지원하기 때문에 코드의 가독성과 안전성이 더욱 향상됩니다.
다음 포스팅은 TAP에 대해 알아보겠습니다.
틀린 점이나 질문이 있으시면 댓글로 남겨주세요
감사합니다 :)
'C#' 카테고리의 다른 글
C# 이미지의 2차원 배열을 순회하는 여러가지 방법 - 1 (0) | 2024.01.19 |
---|---|
C# Partial Class 이해 (0) | 2023.12.27 |
C# 비동기 프로그래밍 : deadlock 문제와 해결 방법 (0) | 2023.11.23 |
C# 비동기 프로그래밍 : Thread와 Task의 차이점 (0) | 2023.11.21 |
C# 비동기 프로그래밍 : Task의 연속 작업 (Continuations) 이해 (0) | 2023.11.20 |