비동기 프로그래밍 패턴

.NET에서는 비동기 작업을 수행하기 위한 세 가지 패턴을 제공합니다.

  • 단일 메서드를 사용하여 비동기 작업 시작과 완료를 나타내는 TAP(작업 기반 비동기 패턴) . TAP는 .NET Framework 4에서 도입되었습니다. .NET에서 비동기 프로그램에 권장되는 방법입니다. C#의 asyncawait 키워드와 Visual Basic의 AsyncAwait 연산자는 TAP에 대한 언어 지원을 추가합니다. 자세한 내용은 TAP(작업 기반 비동기 패턴)을 참조하세요.

  • 비동기 동작을 제공하기 위한 이벤트 기반 레거시 모델인 EAP(이벤트 기반 비동기 패턴) . 이 패턴에서는 Async 접미사가 있는 메서드가 필요하며 하나 이상의 이벤트, 이벤트 처리기 대리자 형식 및 EventArg에서 파생된 형식도 필요합니다. EAP는 .NET Framework 2.0에서 도입되었습니다. 이 패턴 역시 신규 개발에서는 사용하지 않는 것이 좋습니다. 자세한 내용은 EAP(이벤트 기반 비동기 패턴)를 참조하세요.

  • IAsyncResult 인터페이스를 사용하여 비동기 동작을 제공하는 레거시 모델인 APM(비동기 프로그래밍 모델) 패턴(IAsyncResult 패턴이라고도 함). 이 패턴에서는 동기 작업에 BeginEnd 메소드(예를 들어 비동기 쓰기 작업을 구현하는 BeginWriteEndWrite)가 필요합니다. 신규 개발에서는 이 패턴을 더 이상 사용하지 않는 것이 좋습니다. 자세한 내용은 APM(비동기 프로그래밍 모델)을 참조하세요.

패턴 비교

위의 세 가지 패턴 모델이 비동기 작업을 수행하는 방법을 빠르게 비교하려는 경우 지정한 오프셋에서부터 지정된 양의 데이터를 제공된 버퍼로 읽어 들이는 Read 메서드를 사용할 수 있습니다.

public class MyClass  
{  
    public int Read(byte [] buffer, int offset, int count);  
}  

이 메서드에 해당하는 TAP 코드는 다음의 단일 ReadAsync 메서드를 노출합니다.

public class MyClass  
{  
    public Task<int> ReadAsync(byte [] buffer, int offset, int count);  
}  

그리고 이 메서드에 해당하는 EAP 코드는 다음 형식 및 멤버 집합을 노출합니다.

public class MyClass  
{  
    public void ReadAsync(byte [] buffer, int offset, int count);  
    public event ReadCompletedEventHandler ReadCompleted;  
}  

해당하는 APM 코드는 BeginReadEndRead 메소드를 노출합니다.

public class MyClass  
{  
    public IAsyncResult BeginRead(  
        byte [] buffer, int offset, int count,
        AsyncCallback callback, object state);  
    public int EndRead(IAsyncResult asyncResult);  
}  

참조