비동기 메시지 처리
업데이트: 2007년 11월
응용 프로그램의 처리에 상관 없이 메시지를 검색하려면 메시지를 비동기적으로 검색하면 됩니다. 비동기 메시지 처리에서는 작업을 시작하는 메서드가 결과를 기다리지 않고 즉시 반환됩니다. 응용 프로그램에서는 작업이 진행되는 동안 기존 작업을 계속 수행할 수 있습니다. 작업이 완료되면 서버에서 메시지가 성공적으로 처리되었음을 응용 프로그램에 알릴 수 있습니다.
비동기 메시징 기능에는 비동기적 메시지 받기와 비동기적 메시지 피킹(peeking)이 있습니다. 비동기적으로 메시지를 검색하는 경우 BeginReceive 메서드와 EndReceive 메서드를 사용하여 작업의 시작과 끝을 표시합니다. 그러면 다음과 같은 동작이 발생합니다.
큐에서 메시지를 사용할 수 있게 되었을 때 또는 피킹하거나 받고 있는 메시지가 이미 존재하는 경우 BeginReceive 메서드가 즉시 반환되고 ReceiveCompleted 이벤트가 발생합니다.
ReceiveCompleted 이벤트는 비동기 작업에 대한 정보가 포함된 IAsyncResult 형식의 개체를 반환합니다.
완료된 이벤트를 받은 다음 EndReceive 메서드를 호출하여 작업을 완료합니다. 최종 호출에서 ReceiveCompletedEventArgs 클래스에 액세스하여 메시지에 액세스하거나 메시지를 검색할 수 있습니다.
작업하는 동안 계속 IAsyncResult 개체에 액세스할 수 있지만 대개 EndReceive가 호출될 때까지 이 개체를 사용하지 않습니다. 그러나 여러 비동기 작업이 시작되면 IAsyncResult 값을 배열에 넣고 모든 작업이 완료될 때까지 기다릴지 또는 한 작업이 완료될 때까지 기다릴지 여부를 지정할 수 있습니다. 이 경우 IAsyncResult 개체의 AsyncWaitHandle 속성을 사용하여 완료된 작업을 확인합니다.
Peek는 Receive와 마찬가지로 BeginPeek와 EndPeek라는 두 개의 메서드를 사용하여 비동기 작업의 시작과 끝을 나타냅니다. 메시지를 사용할 수 있게 되면 BeginPeek가 즉시 반환되고 PeekCompleted라는 이벤트가 발생합니다. ReceiveCompleted와 마찬가지로 이 이벤트는 작업에 대한 정보를 조작할 수 있는 IAsyncResult 개체를 반환합니다.
또한 비동기 받기 및 피킹(peeking) 작업은 모두 제한 시간을 사용하여 메시지를 사용할 수 있게 될 때까지 기다리는 시간을 지정할 수 있습니다. 이렇게 하려면 메서드의 오버로드 형식을 사용하여 기다리는 시간을 나타내는 TimeSpan 개체를 전달합니다. 제한 시간이 만료되면 ReceiveCompleted 또는 PeekCompleted 이벤트가 발생하지만 IAsyncResult 개체의 IsCompleted 속성이 false로 설정되어 메시지가 처리되지 않았음을 표시합니다.
비동기 처리에 대한 자세한 내용은 다음 페이지를 참조하십시오.
용도 |
참조 |
---|---|
비동기적으로 메시지를 받는 방법에 대한 단계별 설명 |
|
BeginPeek 메서드 및 관련 멤버에 대한 개요 |
|
BeginReceive 메서드 및 관련 멤버에 대한 개요 |
비동기 작업 알림 받기
비동기 받기 또는 피킹(peeking) 작업이 성공적으로 완료되었을 경우 알림을 받을 수 있는 방법이 두 가지 있습니다.
ReceiveCompleted 또는 PeekCompleted 이벤트를 처리할 이벤트 처리기를 만듭니다.
콜백을 사용하여 자동으로 들어오는 메시지를 감시하고 메시지가 도착하면 응용 프로그램에 처리하도록 전달합니다.
이벤트 알림을 사용하는 경우 메시지를 처리하는 메서드를 만들고 처리가 완료되면 알림을 반환합니다. 그런 다음 비동기 처리를 시작하는 메서드를 호출합니다. 디자이너에서 MessageQueue 구성 요소를 두 번 클릭하면 시스템에서 자동으로 이벤트 처리기를 만듭니다.
참고: |
---|
이벤트 알림 시나리오에서 BeginPeek 또는 BeginReceive는 메시지 하나를 반환한 다음 처리를 중단합니다. 검색할 각 메시지에 대해 BeginPeek 또는 BeginReceive를 다시 호출해야 합니다. |
메시지를 비동기적으로 처리하는 다른 방법은 콜백을 사용하는 것입니다. 콜백은 BeginPeek 또는 BeginReceive 작업과 연관시킬 대리자를 식별합니다. 이 시나리오에서 대리자는 각 메시지가 처리된 다음 계속 새 이벤트 알림을 감시합니다.