2014-02-18 74 views
5

在.NET上的MSMQ中,我使用MessageEnumerator來查看隊列中的所有消息。我想刪除符合特定條件的郵件。與MessageEnumerator RemoveCurrent我如何知道我是否在排隊結束?

當我調用MoveNext逐步通過隊列時,我得到一個布爾值來告訴我當前消息是否存在。但是,當我執行RemoveCurrent時,如何知道刪除後的當前消息是否存在?檢查Current並處理異常的唯一方法是?

這裏是一個例子,我使用了刪除超過一年的消息的簡單條件。假設隊列在別處創建和MessageReadPropertyFilter.ArrivedTime = true設置:

private void RemoveOldMessages(MessageQueue q) 
{ 
    MessageEnumerator me = q.GetMessageEnumerator2(); 
    bool hasMessage = me.MoveNext(); 
    while (hasMessage) 
    { 
     if (me.Current.ArrivedTime < DateTime.Now.AddYears(-1)) 
     { 
      Message m = me.RemoveCurrent(new TimeSpan(1)); 
      // Removes and returns the current message 
      // then moves to the cursor to the next message 
      // How do I know if there is another message? Is this right?: 
      try 
      { 
       m = me.Current; 
       hasMessage = true; 
      } 
      catch (MessageQueueException ex) 
      { 
       hasMessage = false; 
      } 

     } 
     else 
     { 
      hasMessage = me.MoveNext(); 
      // MoveNext returns a boolean to let me know if is another message 
     } 
    } 
} 

回答

1

雖然遲來:

每次調用RemoveCurrent()會取消枚舉。因此,您需要調用Reset()以始於Enumerator(Message Queue)的開頭。

private void RemoveOldMessages(MessageQueue q) 
{ 
    MessageEnumerator me = q.GetMessageEnumerator2(); 

    while (me.MoveNext()) 
    { 
     try 
     { 
      Message m = me.RemoveCurrent(); 

      // Handle Message 
     } 
     finally 
     { 
      me.Reset(); 
     } 
    } 
} 
+0

這絕對應該是公認的答案。 MSMQ文檔並不清楚,這是我見過的第一個解決方案。理想情況下,RemoveCurrent不應增加計數器。 –

相關問題