我正在编写一个从Microsoft Message Queue(MSMQ)查看消息的应用程序。我希望我的应用程序依次查看MSMQ消息(从第一条消息到最后一条消息)。在完全查看最后一条消息后,主线程将被阻塞,直到MSMQ有新消息到达。
我已经编写了一些代码,但有一个例外,如下所示:
Message ret = null;
Cursor cursor = mq.CreateCursor();
bool isTheFirst = true;
while (true) {
if (isTheFirst) {
ret = mq.Peek(new TimeSpan(Timeout.Infinite), cursor, PeekAction.Current);
Console.WriteLine(ret.Id);
isTheFirst = false;
} else {
// after my app peeks the last message completly, the peek method
//throw an exception: "Timeout is expired!"
ret = mq.Peek(new TimeSpan(Timeout.Infinite), cursor, PeekAction.Next);
Console.WriteLine(ret.Id);
}
Thread.Sleep(1000);
}
任何人都可以帮我解决这个问题。谢谢!
答案 0 :(得分:4)
您应该使用MessageQueue.InfiniteTimeout
代替Timeout.infinite
。尝试将其更改为此值
ret = mq.Peek(MessageQueue.InfiniteTimeout, cursor, PeekAction.Current);
值不一样
var timeout = MessageQueue.InfiniteTimeout; // {49.17:02:17.2950000}
var timeout2 = new TimeSpan(Timeout.Infinite); // {-00:00:00.0000001}
因此队列Peek
的行为方式不同