2012-04-16 53 views
2

我有一些旧代码,使用BeginPeek/EndPeek从MSMQ偷看消息。偷看后直接它比较成功的消息的ID:peeked MSMQ消息的message.ID以某种方式丢失了

if (message.Id != _lastMessageID) { // ... } 

在代码message.Id后来被传递给ReceiveById方法。这工作的大部分时间,不过,偶尔有确切的在这个位置上抛出的异常:

System.InvalidOperationException:收到消息时

所以有时候莫名其妙message.Id属性标签没有被检索 在此期间似乎迷失了方向。有人知道这样的行为吗?或有任何想法?

回答

2

我以前遇到过这个问题。问题在于我的代码调用了BeginPeek两次,导致PeekCompleted事件被抛出两次,每次都有相同的消息。检查消息标识以查看产生错误的消息是否已在您的应用程序的较早时间点收到。我不得不在我的PeekComplete事件处理程序中打印出消息ID作为第一步来捕获此消息。您必须非常小心,如果已经发出并且没有返回,则不会致电BeginPeek。