MSMQ CreateCursor NullReferenceException

goa*_*960 6 .net c# msmq

我有一个网站,在远程服务器上使用MSMQ来排队待处理的电子邮件.我能够将消息写入队列,然后在队列上调用dispose.队列仍然获取消息,但稍后GC出现并尝试清理它会导致IIS崩溃.这是我在事件日志中看到的:

例外: System.NullReferenceException

消息:对象引用未设置为对象的实例.

堆栈跟踪: 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);
}
Run Code Online (Sandbox Code Playgroud)

try-catch这个代码周围有一个,我知道它永远不会进入这个代码catch块.我开始认为这是整个应用程序从.NET 3.5升级到.NET 4.0时引起的.然而,它偶尔会开始发生,但现在每次我向队列写一条消息时都会发生这种情况.

编辑2

这是代码 BuildQueue

lock (lockHandler)
{
    return new System.Messaging.MessageQueue(queuePath);
}
Run Code Online (Sandbox Code Playgroud)

ic3*_*3rg 0

尝试使用事务:

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();
    }
}
Run Code Online (Sandbox Code Playgroud)