作者热门文章
- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我有一个网站使用远程服务器上的 MSMQ 来排队待处理的电子邮件。我能够将消息写入队列,然后在队列上调用 dispose。队列仍然收到消息,但稍后 GC 出现并尝试清理并导致 IIS 崩溃。这是我在事件日志中看到的:
Exception:
System.NullReferenceException
Message: Object reference not set to an instance of an object.
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
block 。我开始认为这是在整个应用程序从 .NET 3.5 升级到 .NET 4.0 时引起的。然而,它开始偶尔发生,但现在每次我向队列写入消息时都会发生。
编辑2
这是BuildQueue
lock (lockHandler)
{
return new System.Messaging.MessageQueue(queuePath);
}
最佳答案
尝试使用事务:
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();
}
}
关于c# - MSMQ CreateCursor NullReferenceException 异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14126253/
我有一个网站使用远程服务器上的 MSMQ 来排队待处理的电子邮件。我能够将消息写入队列,然后在队列上调用 dispose。队列仍然收到消息,但稍后 GC 出现并尝试清理并导致 IIS 崩溃。这是我在事
我是一名优秀的程序员,十分优秀!