영어로 읽기

다음을 통해 공유


APM(비동기 프로그래밍 모델)

IAsyncResult 디자인 패턴을 사용하는 비동기 작업은 각각 비동기 작업 OperationName을 시작하고 종료하는 BeginOperationNameEndOperationName이라는 두 개의 메서드로 구현됩니다. 예를 들어 FileStream 클래스는 파일에서 바이트를 비동기적으로 읽는 BeginReadEndRead 메서드를 제공합니다. 이러한 메서드는 비동기 버전의 Read 메서드를 구현합니다.

참고

.NET Framework 4부터는 작업 병렬 라이브러리에서 비동기 및 병렬 프로그래밍을 위한 새로운 모델을 제공합니다. 자세한 내용은 TPL(작업 병렬 라이브러리)TAP(작업 기반 비동기 패턴)을 참조하세요.

BeginOperationName을 호출한 후에는 비동기 작업이 다른 스레드에서 발생되는 동안 애플리케이션에서 호출 스레드에 대한 명령을 계속 실행할 수 있습니다. BeginOperationName에 대한 각 호출에 대해 애플리케이션도 EndOperationName을 호출하여 작업 결과를 가져와야 합니다.

비동기 작업 시작

BeginOperationName 메서드는 비동기 작업 OperationName을 시작하고 IAsyncResult 인터페이스를 구현하는 개체를 반환합니다. IAsyncResult 개체는 비동기 작업에 대한 정보를 저장합니다. 다음 표에서는 비동기 작업에 대한 정보를 보여 줍니다.

멤버 설명
AsyncState 비동기 작업에 대한 정보를 포함하는 애플리케이션별 선택적 개체입니다.
AsyncWaitHandle 비동기 작업이 완료될 때까지 애플리케이션 실행을 차단하기 위해 사용할 수 있는 WaitHandle 입니다.
CompletedSynchronously 비동기 작업이 별도의 ThreadPool 스레드에서 완료되는 대신 BeginOperationName을 호출하는 데 사용된 스레드에서 완료되었는지 여부를 나타내는 값입니다.
IsCompleted 비동기 작업이 완료되었는지 여부를 나타내는 값입니다.

BeginOperationName 메서드에는 값 또는 참조로 전달되는 동기 버전의 메서드 시그니처에 선언된 매개 변수가 사용됩니다. out 매개 변수는 BeginOperationName 메서드 시그니처의 일부가 아닙니다. BeginOperationName 메서드 시그니처에는 두 개의 추가 매개 변수도 포함되어 있습니다. 그중 첫 번째 매개 변수는 비동기 작업이 완료될 때 호출되는 메서드를 참조하는 AsyncCallback 대리자를 정의합니다. 호출자는 작업이 완료될 때 호출되는 메서드를 원하지 않는 경우 null (Visual Basic에서는Nothing )을 지정할 수 있습니다. 두 번째 추가 매개 변수는 사용자 정의 개체입니다. 이 개체를 사용하여 비동기 작업이 완료될 때 호출되는 메서드로 애플리케이션별 상태 정보를 전달할 수 있습니다. 파일에서 읽은 바이트를 저장하는 바이트 배열과 같이 BeginOperationName 메서드에서 작업 관련 추가 매개 변수를 사용하는 경우 AsyncCallback 및 애플리케이션 상태 개체는 BeginOperationName 메서드 시그니처의 마지막 매개 변수가 됩니다.

BeginOperationName은 호출 스레드에 대한 컨트롤을 즉시 반환합니다. BeginOperationName 메서드가 예외를 throw하면 이 예외는 이 비동기 작업이 시작되기 전에 throw됩니다. BeginOperationName 메서드가 예외를 throw하면 콜백 메서드는 호출되지 않습니다.

비동기 작업 끝내기

EndOperationName 메서드는 비동기 작업 OperationName을 종료합니다. EndOperationName 메서드의 반환 값은 이에 상응하는 동기 항목의 반환 값과 같은 유형으로서 비동기 작업에 대해서만 사용됩니다. 예를 들어 EndRead 메서드는 FileStream 에서 읽은 바이트 수를 반환하고 EndGetHostByName 메서드는 호스트 컴퓨터에 대한 정보를 포함하는 IPHostEntry 개체를 반환합니다. EndOperationName 메서드는 동기 버전의 메서드 시그니처에 선언된 out 또는 ref 매개 변수를 사용합니다. EndOperationName 메서드에는 동기 메서드의 매개 변수와 함께 IAsyncResult 매개 변수도 포함되어 있습니다. 호출자는 BeginOperationName에 대한 해당 호출로 반환된 인스턴스를 전달해야 합니다.

EndOperationName이 호출되었을 때 IAsyncResult 개체에 표시되는 비동기 작업이 완료되지 않은 경우에는 EndOperationName에서 비동기 작업이 완료될 때까지 해당 호출 스레드를 차단합니다. 비동기 작업이 throw한 예외는 EndOperationName 메서드에서 throw됩니다. 같은 IAsyncResultEndOperationName 메서드를 여러 번 호출한 데 따른 효과는 정의되어 있지 않습니다. 마찬가지로 관련된 Begin 메서드에서 반환하지 않은 IAsyncResultEndOperationName 메서드를 호출하는 경우도 정의되어 있지 않습니다.

참고

정의되지 않은 두 시나리오 중 하나의 경우 구현자는 InvalidOperationException을 throw하는 것을 고려해야 합니다.

참고

이 디자인 패턴의 구현자는 IsCompleted 를 true로 설정하여 비동기 콜백 메서드(지정된 경우)를 호출하고 AsyncWaitHandle을 신호로 보내서 비동기 작업이 완료되었다는 것을 호출자에게 알려야 합니다.

애플리케이션 개발자는 비동기 작업의 결과에 액세스하기 위해 여러 디자인을 선택할 수 있습니다. 어떤 선택이 올바른 선택인지는 애플리케이션에 작업이 완료되는 동안 실행할 수 있는 지침이 있는지 여부에 따라 달라집니다. 비동기 작업의 결과를 받을 때까지 애플리케이션이 추가 작업을 수행할 수 없는 경우 결과를 사용할 수 있을 때까지 애플리케이션을 차단해야 합니다. 비동기 작업이 완료될 때까지 차단하려면 다음 방법 중 하나를 사용하면 됩니다.

비동기 작업이 완료되는 동안 차단할 필요가 없는 애플리케이션은 다음 방법 중 하나를 사용할 수 있습니다.

참고 항목