我有一个网站,它使用远程服务器上的MSMQ对挂起的电子邮件进行排队。我能够将消息写入队列,然后在队列上调用dispose。队列仍然会收到消息,但稍后GC会出现并试图清理,从而导致IIS崩溃。这就是我在事件日志中看到的:
例外:
System.NullReferenceException消息:对象引用未设置为对象的实例。 StackTrace:at System.Messaging.Cursor.Finalize()
这段代码多年来一直运行良好,但最近才开始运行。我已经重新启动了所有服务器来排除它,但这并没有帮助。
编辑1
下面是发送消息的代码。QueueFactory只是一个具有创建MessageQueue的锁的单例。
using (System.Messaging.MessageQueue queue
= QueueFactory.Instance.BuildQueue(this.Path))
{
System.Messaging.Message message = new System.Messaging.Message
{
Body = body,
Formatter = new BinaryMessageFormatter(),
TimeToBeReceived = this.ExpirationMinutes
};
queue.Send(message, label);
}在这段代码中有一个try-catch,我知道它从未进入catch块。我开始认为这是当整个应用程序从.NET 3.5升级到.NET 4.0时造成的。然而,它开始偶尔发生,但现在每当我向队列写入消息时,都会发生这种情况。
编辑2
以下是BuildQueue的代码
lock (lockHandler)
{
return new System.Messaging.MessageQueue(queuePath);
}发布于 2013-01-11 14:53:07
尝试使用一个事务:
using (System.Messaging.MessageQueue queue
= QueueFactory.Instance.BuildQueue(this.Path))
{
System.Messaging.Message message = new System.Messaging.Message
{
Body = body,
Formatter = new BinaryMessageFormatter(),
TimeToBeReceived = this.ExpirationMinutes
};
MessageQueueTransaction transaction = new MessageQueueTransaction();
try
{
transaction.Begin();
queue.Send(message, label, transaction);
transaction.Commit();
}
catch(System.Exception e)
{
transaction.Abort();
throw e;
}
finally
{
transaction.Dispose();
}
}https://stackoverflow.com/questions/14126253
复制相似问题