2012-06-29 2 views
3

PeekCompleted를 사용하여 MessageQueue에서 메시지를 읽는 중입니다. 여기에서 프로세스를 수행하고 모든 것이 제대로 수행되면 큐에서 제거해야합니다! currenty 나는 MyMessageQueue.Receive()를 사용하고 있으며 작동하지만, 이것은 각 메시지가 올바르게 처리되도록 만드는 신뢰할 수있는 방법인가?PeekCompleted 메서드의 messageQueue에서 큐 꺼내기

MessageQueue MyMessageQueue; 
    public Form1() 
    { 
     InitializeComponent(); 

     MyMessageQueue = new MessageQueue(@".\private$\Dms"); 
     MyMessageQueue.PeekCompleted += new PeekCompletedEventHandler(MessageQueue_PeekCompleted); 
     MyMessageQueue.Formatter = new XmlMessageFormatter(new Type[] { typeof(string) }); 
     MyMessageQueue.BeginPeek(); 
    } 

    void MessageQueue_PeekCompleted(object sender, PeekCompletedEventArgs e) 
    { 
     try 
     { 
      Debug.WriteLine("ToProcess:" + e.Message.Body); 
      //Long process that maybe fail 
      MyMessageQueue.Receive(); 
     } 
     finally 
     { 
      MyMessageQueue.BeginPeek(); 
     } 
    } 

답변

4

Receive()는 대기열에서 첫 번째 메시지를 수신하여 대기열에서 제거합니다. 당신이 을 필요로하는 것은 둘째 MessageQueue.ReceiveById Method

MyMessageQueue.ReceiveById(e.Message.Id); 

, 내가 생각하는, 당신은 항상, 내가 다른하도록 할 수 있습니다 난 항상 이런 식으로하기 때문에 같은 BeginPeek() 메소드를 사용하려고 MessageQueue.EndPeek Method

Message m = MyMessageQueue.EndPeek(e.AsyncResult); 
0

를 호출해야 메시지 도착 시간이 지연되고 완료 후 peek이 반환되는 경우에도 작업을 처리 할 수 ​​있으므로 메시지를 선택할 수 있습니다. 위에서 설명한 코드 스 니펫을 예제로 보았습니다. 클라이언트 응용 프로그램의 전체 try 및 catch 블록과 함께 새 메시지 검사를 수행하기 위해 자체 클래스/메소드를 작성해야 할 수도 있기 때문에 코드 스 니펫을 예제로 보여주었습니다.

1

이것은 항상 대기열의 수신자가 하나 뿐인 경우에 효과적입니다. 다른 프로세스는 BeginPeek 및 Receive 메소드 사이에서 메시지를 들여다 볼 수 있습니다. 위의 ReceiveById 제안에도 해당됩니다.

수신자가 한 명이라면 DenySharedReceive 플래그를 사용하여 대기열을 열어 시행 할 수 있습니다.