다음을 통해 공유


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

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

비고

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

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

비동기 작업 시작

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

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

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

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

비동기 작업 종료

메서드는 EndOperationName 비동기 작업 OperationName을 종료합니다. 메서드의 EndOperationName 반환 값은 동기 대응에서 반환하는 형식과 동일하며 비동기 작업에만 적용됩니다. 예를 들어, EndRead 메서드는 FileStream에서 읽은 바이트 수를 반환하고, EndGetHostByName 메서드는 호스트 컴퓨터에 대한 정보를 포함하는 IPHostEntry 객체를 반환합니다. 메서드는 EndOperationName 메서드의 동기 버전의 서명에 선언된 out 또는 ref 매개 변수를 가져옵니다. 동기 메서드의 매개 변수 외에도 메서드에는 EndOperationName 매개 변수도 포함됩니다 IAsyncResult . 호출자는 해당 호출에서 반환된 인스턴스를 전달해야 합니다 BeginOperationName.

개체가 나타내는 IAsyncResult 비동기 작업이 호출 EndOperationName 될 때 EndOperationName 완료되지 않은 경우 비동기 작업이 완료될 때까지 호출 스레드를 차단합니다. 비동기 작업에서 발생한 예외는 EndOperationName 메서드로부터 throw됩니다. 동일한 EndOperationNameIAsyncResult 메서드를 여러 번 호출하는 효과는 정의되지 않습니다. 마찬가지로, 관련된 Begin 메서드로부터 반환되지 않은 EndOperationNameIAsyncResult 메서드와 함께 호출하는 것도 정의되지 않습니다.

비고

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

비고

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

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

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

참고하십시오