【发布时间】:2013-10-31 14:36:59
【问题描述】:
我在 Windows 服务中使用 MSMQ。
当服务暂停时,我想关闭 MSMQ 并在服务恢复时重新打开它。
代码如下所示:
开机
_mq.ReceiveCompleted += this.ReceiveCompletedHandler;
_mq.BeginReceive();
暂停
// MessageQueue.ClearConnectionCache();
_mq.Close();
继续
与 OnStart 相同
现在,这可以在.Close() 之后在ReceiveCompletedHandler 中引发异常:
private void ReceiveCompletedHandler(object sender, ReceiveCompletedEventArgs e)
{
Message message = this.mq.EndReceive(e.AsyncResult); // or e.Message
// do stuff
}
异常详情:
输入:MessageQueueException
留言:null
错误代码:-2147467259
MessageQueueErrorCode:-1073741536
我该如何防止这种发生?
【问题讨论】:
-
这是一个低级Windows错误代码,ERROR_CANCELLED,“I/O请求被取消”。嗯,是的,当它还有一个未决的读取时,你通过关闭队列来猛拉地板垫。这通常应该生成一个 ObjectDisposedException,您必须用 try/catch 包装 EndReceive() 调用,以便您可以处理它。闻起来像你有一些非标准的网络驱动程序或反恶意软件阻碍了生成更好的异常。如果你不知道那台机器有什么特别之处,你最好也抓住这个异常。
-
感谢您的解释。这就是我现在所做的,但我希望有一种方法可以防止异常,而不是捕获它。
-
不,您总是会遇到异常。发生异常情况,您开始阅读,但无法正常完成。所以它让你知道这一点,这样你就可以清理状态。这都是完全正常的,预计会捕获异常。非例外的方法是停止调用BeginRead,不实用。
-
就这样吧 :) 你能把它作为答案发布以便我接受吗?
-
我不喜欢那个 ERROR_CANCELLED 错误代码。这不正常,我无法给出你看到它的充分理由。
标签: c# .net windows-services msmq message-queue