gpt4 book ai didi

c# - MSMQ CreateCursor NullReferenceException 异常

转载 作者:太空狗 更新时间:2023-10-29 22:01:20 26 4
gpt4 key购买 nike

我有一个网站使用远程服务器上的 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com