C# MSMQ-我可以查询当前正在处理的邮件吗?

C# MSMQ-我可以查询当前正在处理的邮件吗?,c#,wcf,msmq,netmsmqbinding,msmq-wcf,C#,Wcf,Msmq,Netmsmqbinding,Msmq Wcf,我正在将WCF与MSMQ端点一起使用,并且看到了中描述的行为-基本上,尽管服务被限制为一次处理一条消息,但从队列中提取了两条消息,其中一条消息似乎保存在内存中,而另一条消息正在处理中 这给监控正在发生的事情带来了问题;我有一个监控页面,显示哪些作业在队列中,哪些正在处理,但由于这种行为,当作业从队列中取出但尚未开始处理时,会有一段时间实际上消失。我正在使用MessageQueue.GetAllMessages()获取队列中当前的消息列表 我对MSMQ不太熟悉,但我假设当消息被出列时,它会被标记为

我正在将WCF与MSMQ端点一起使用,并且看到了中描述的行为-基本上,尽管服务被限制为一次处理一条消息,但从队列中提取了两条消息,其中一条消息似乎保存在内存中,而另一条消息正在处理中

这给监控正在发生的事情带来了问题;我有一个监控页面,显示哪些作业在队列中,哪些正在处理,但由于这种行为,当作业从队列中取出但尚未开始处理时,会有一段时间实际上消失。我正在使用
MessageQueue.GetAllMessages()
获取队列中当前的消息列表


我对MSMQ不太熟悉,但我假设当消息被出列时,它会被标记为不可见,以便其他进程不会将其删除。有没有办法查询这些消息以便我可以看到它们是什么

我可以看出这是多么烦人,尤其是在消息量很低的情况下,消息处理程序在返回获取下一条消息之前启动了一个长时间运行的过程

然而,从语义上讲,当消息从实际正在处理的队列中消失时,只是处理有时会涉及无限期地缓存消息

只要您使用的是事务性队列,如果服务因某种原因消失,隐藏的消息就不会被删除

请注意,这不会直接回答您的问题。

如果您确实想这样做,请尝试使用光标查看。不过,对于一个监控页面来说,听起来有点过头了


您可以将其设置为获取整个消息等,但不确定对性能的影响。我以前也做过类似的事情…

谢谢,我已经测试了耐久性,并确认在服务失败时隐藏的消息会返回队列。令人恼火的是,没有办法准确地了解正在发生的事情。是的,这很恼人。欢迎使用MSMQ。peek是否允许您查看正在处理的消息?我想我已经试过了,但也许我做错了什么。或者你是在建议有人打电话给peek,等待消息进入队列?是的,就是这样。光标保持活动状态并查看传入的消息。使用类似于msdn示例的POC,看看它是否适合。超时可能很有趣,但你可以让它变大,它会引发超时。嗯,我想这可能会起作用,尽管它可能很棘手,因为它是一个IIS托管服务。我认为你是对的,这可能是我的监控页面的过度杀伤力。如果我找不到其他方法,我会记住这一点。IIS中的宿主是一件独立的事情…如果您想快速查看peek的外观,请查看MSMQ Inspector()-查看队列消息并打开“常量peek模式”,它正是我们所讨论的。