방법: 비동기적으로 메시지 받기
업데이트: 2007년 11월
비동기적으로 메시지를 검색하는 방법에는 다음과 같이 두 가지가 있습니다. 즉, 이벤트 처리기를 사용하여 작업 처리가 끝나면 알림을 받거나 콜백을 사용하는 것입니다. 비동기 메시징에 대한 개요를 보려면 비동기 메시지 처리를 참조하십시오.
이벤트 알림에서 비동기 호출이 완료되면 우선 이벤트 처리기를 실행할 프로시저로 바인딩합니다. 그런 다음 코드에서 BeginReceive 메서드를 호출합니다. 이렇게 하면 비동기 처리가 시작되고 메시지를 사용할 수 있게 되거나 시간 제한 매개 변수가 만료되면 구성 요소에 처리를 반환합니다. 호출에서 반환되면 시스템에서는 사용자가 정의한 대리자를 실행하고 검색 결과를 처리합니다. 그런 다음 EndReceive 메서드를 호출하여 작업이 끝났음을 나타냅니다.
참고: |
---|
BeginReceive는 하나의 메시지만 검색합니다. 계속 비동기적으로 메시지를 처리하려면 BeginReceive 메서드를 다시 호출하거나 BeginReceive의 콜백 매개 변수를 사용하여 큐에 새 메시지가 도착했는지 계속 감시하는 대리자를 호출해야 합니다. |
비동기적으로 메시지를 받는 것과 함께 비동기적으로 메시지를 피킹(peeking)할 수도 있습니다. 두 과정의 패턴은 비동기적으로 피킹(peeking)하기 위해 BeginPeek 메서드를 사용한다는 점을 제외하고는 매우 유사합니다.
프로그래밍 방식으로 MessageQueue 개체를 만들려면
프로젝트에 System.Messaging.dll에 대한 참조를 추가합니다.
구현할 클래스에 MessageQueue 개체의 인스턴스를 만들고 생성자에서 Path 속성을 설정한 다음 Formatter 속성을 설정합니다.
' Add this to the constructor Dim targetTypeNames() As String = _ New String() {"System.String,mscorlib"} mq.Formatter = _ New System.Messaging.XmlMessageFormatter(targetTypeNames)
// Add this to the class declarations. System.Messaging.MessageQueue mq = new System.Messaging.MessageQueue(".\\MyQueue"); // Add this to the constructor. mq.Formatter = new System.Messaging.XmlMessageFormatter( new string[] { "System.String,mscorlib" });
디자이너에 MessageQueue 개체를 만들려면
프로젝트에 System.Messaging.dll에 대한 참조를 추가합니다.
도구 상자에서 MessageQueue 구성 요소를 디자이너로 끌어 옵니다. QueueName 속성을 mq로 설정합니다. Formatter 속성을 XmlMessageFormatter로 설정합니다. Path 속성을 ".\MyQueue"로 설정합니다.
이벤트 알림을 사용하여 비동기적으로 메시지를 받으려면
ReceiveCompleted 이벤트에 대한 이벤트 처리기를 만듭니다. 디자이너에서 MessageQueue 구성 요소를 두 번 클릭하고 아래의 코드를 추가합니다.
Private Sub mq_ReceiveCompleted(ByVal sender As System.Object, _ ByVal e As System.Messaging.ReceiveCompletedEventArgs) _ Handles mq.ReceiveCompleted ' Add code here to respond to message. End Sub
private void mq_ReceiveCompleted(object sender, System.Messaging.ReceiveCompletedEventArgs e) { // Add code here to respond to message. }
이벤트 처리기 안에 코드를 작성하여 메시지를 검색하고 Message 개체를 사용하여 비동기 호출의 결과를 검색합니다. 다음 코드에서는 메시지를 검색하여 콘솔에 표시합니다.
Private Sub mq_ReceiveCompleted(ByVal sender As System.Object, _ ByVal e As System.Messaging.ReceiveCompletedEventArgs) _ Handles mq.ReceiveCompleted Dim m As System.Messaging.Message = mq.EndReceive(e.AsyncResult) m.Formatter = New System.Messaging.XmlMessageFormatter( _ New String() {"System.String,mscorlib"}) Console.WriteLine("Message: " + m.Body.ToString()) End Sub
private void mq_ReceiveCompleted(object sender, System.Messaging.ReceiveCompletedEventArgs e) { System.Messaging.Message m = mq.EndReceive(e.AsyncResult); m.Formatter = new System.Messaging.XmlMessageFormatter( new string[] { "System.String,mscorlib" }); Console.WriteLine("Message: " + (string)m.Body); }
코드에서 BeginReceive 메서드를 호출하여 비동기 작업을 시작합니다. 예를 들어, 다음 코드에서는 사용자가 단추를 클릭하면 메서드를 호출합니다.
Private Sub Button1_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles Button1.Click mq.BeginReceive() End Sub
private void button1_Click(object sender, System.EventArgs e) { mq.BeginReceive(); }
메시지를 계속 비동기적으로 받으려면 다음과 같이 ReceiveCompleted 이벤트 처리기에서 BeginReceive 메서드를 다시 호출합니다. 이렇게 하면 큐에서 받는 새 메시지를 구성 요소에서 계속 처리할 수 있습니다.
Private Sub mq_ReceiveCompleted(ByVal sender As System.Object, _ ByVal e As System.Messaging.ReceiveCompletedEventArgs) _ Handles mq.ReceiveCompleted Dim m As System.Messaging.Message = mq.EndReceive(e.AsyncResult) m.Formatter = New System.Messaging.XmlMessageFormatter( _ New String() {"System.String,mscorlib"}) Console.WriteLine("Message: " + m.Body.ToString()) mq.BeginReceive() End Sub
private void mq_ReceiveCompleted(object sender, System.Messaging.ReceiveCompletedEventArgs e) { System.Messaging.Message m = mq.EndReceive(e.AsyncResult); m.Formatter = new System.Messaging.XmlMessageFormatter( new string[] { "System.String,mscorlib" }); Console.WriteLine("Message: " + (string)m.Body); mq.BeginReceive(); }
콜백을 사용하여 비동기적으로 메시지를 받으려면
메시지 작업과 관련된 정보를 정의하는 클래스를 만듭니다. 여기에서는 Customer 클래스를 정의합니다.
Public Class Customer Public Name As String = "" Public Sub New(ByVal newName As String) Name = newName End Sub End Class
public class Customer { public string Name = ""; public Customer(string name) { Name = name; } }
클래스의 인스턴스를 만듭니다. 이 개체는 콜백 메서드로 전달됩니다.
Dim george As New Customer("George")
Customer george = new Customer("George");
AsyncCallback 대리자에 따라 콜백 메서드를 만듭니다. 이 메서드에는 메시지를 받은 다음 처리해야 할 사항이 포함됩니다. result 매개 변수의 AsyncState 속성에는 메시지 작업에 대한 정보를 전달하기 위해 만든 개체가 포함됩니다. 이 경우 AsyncState는 Customer 개체입니다.
Private Sub ReceiveCallback(ByVal result As System.IAsyncResult) Dim buyer As Customer = CType(result.AsyncState, Customer) Dim buyerName As String = buyer.Name End Sub
private void ReceiveCallback(System.IAsyncResult result) { Customer buyer = (Customer)result.AsyncState; string buyerName = buyer.Name; }
코드에서 BeginReceive 메서드를 호출하여 비동기 작업을 시작합니다. 예를 들어, 다음 코드에서는 사용자가 단추를 클릭하면 메서드를 호출합니다. 메시지가 메시지 큐로 보내지면 큐를 통해 메시지를 읽습니다. 앞의 3단계에서 정의된 ReceiveCallback 메서드는 메시지를 받을 때 호출됩니다.
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _ Handles Button1.Click MessageQueue1.Send("Buy six eggs.", george.Name) MessageQueue1.BeginReceive(New System.TimeSpan(0, 0, 5), george, _ AddressOf ReceiveCallback) End Sub
private void button1_Click(object sender, System.EventArgs e) { messageQueue1.Send("Buy six eggs.", george.Name); messageQueue1.BeginReceive(new System.TimeSpan(0, 0, 5), george, new System.AsyncCallback(this.ReceiveCallback)); }
참고 항목
작업
방법: MessageQueue 구성 요소 인스턴스 만들기