2012-06-29 29 views
3

我正在使用PeekCompleted從MessageQueue中讀取消息,我在此處執行我的過程,如果一切正常,我需要將它從隊列中刪除!目前我正在使用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); 

其次,我認爲,你總是需要調用MessageQueue.EndPeek Method

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

我總是嘗試使用,因爲這種方式同樣BeginPeek()方法,我可以讓其他即使消息到達延遲,並且完成後返回peek,也可以處理作業,您可以選擇該消息。我認爲上面你只是以代碼片段爲例,因爲你可能需要編寫自己的類/方法來完成新的消息檢查,以及客戶端應用程序中的完整try和catch塊。

1

如果你總是隻有一個隊列接收者 - 另一個進程可以在BeginPeek和Receive方法之間偷看並接收該消息,這將工作。上面的ReceiveById建議也是如此。

如果您只想要一個接收器,您可以使用DenySharedReceive標誌打開隊列來強制執行此操作。