C# MSMQ:MessageQueue.Close()在.EndReceive()处引发异常-1073741536

C# MSMQ:MessageQueue.Close()在.EndReceive()处引发异常-1073741536,c#,.net,windows-services,msmq,message-queue,C#,.net,Windows Services,Msmq,Message Queue,我正在Windows服务中使用MSMQ。 当服务暂停时,我想关闭MSMQ,然后在服务恢复时重新打开它 代码如下所示: OnStart _mq.ReceiveCompleted += this.ReceiveCompletedHandler; _mq.BeginReceive(); 暂停 // MessageQueue.ClearConnectionCache(); _mq.Close(); OnContinue // MessageQueue.ClearConnectionCache();

我正在Windows服务中使用MSMQ。
当服务暂停时,我想关闭MSMQ,然后在服务恢复时重新打开它

代码如下所示:

OnStart

_mq.ReceiveCompleted += this.ReceiveCompletedHandler;
_mq.BeginReceive();
暂停

// MessageQueue.ClearConnectionCache();
_mq.Close();
OnContinue

// MessageQueue.ClearConnectionCache();
_mq.Close();
与OnStart相同

现在,这可以工作了,但是在
.Close()
之后,
接收完成处理程序中会抛出一个异常:

private void ReceiveCompletedHandler(object sender, ReceiveCompletedEventArgs e)
{
    Message message = this.mq.EndReceive(e.AsyncResult); // or e.Message
    // do stuff
}
异常详细信息:

类型:
MessageQueueException

消息:
null

错误代码:
-2147467259

MessageQueueErrorCode:
-1073741536

我如何防止这件事发生

在OnPause中,在调用Close()方法之前尝试执行以下操作:


_mq.ReceiveCompleted-=此.ReceiveCompletedHandler

这是一个低级Windows错误代码,错误被取消,“I/O请求被取消”。嗯,是的,你在排队等候阅读的时候把队伍关上了,把地板垫弄得乱七八糟。这通常是为了生成ObjectDisposedException,您必须用try/catch包装EndReceive()调用,以便处理该问题。闻起来好像有一些非标准的网络驱动程序或反恶意软件妨碍了生成更好的异常。如果你不能弄清楚那台机器有什么特别之处,你最好也抓住这个例外。谢谢你的解释。这就是我现在所做的,但我希望有一种方法可以防止异常,而不是捕获异常。不,你总是会遇到异常。发生异常情况,您开始读取,但无法正常完成。所以它让你知道,所以你可以清理状态。这是完全正常的,捕获异常是意料之中的。非例外的方法是停止调用BeginRead,这是不实际的。就这样吧:)你能把它作为一个答案发布,这样我就可以接受吗?我不喜欢那个错误代码。这是不正常的,我不能给你一个很好的理由为什么你会看到它。