首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MSMQ NullReferenceException

MSMQ NullReferenceException
EN

Stack Overflow用户
提问于 2013-01-02 17:17:38
回答 1查看 1.3K关注 0票数 6

我有一个网站,它使用远程服务器上的MSMQ对挂起的电子邮件进行排队。我能够将消息写入队列,然后在队列上调用dispose。队列仍然会收到消息,但稍后GC会出现并试图清理,从而导致IIS崩溃。这就是我在事件日志中看到的:

例外:System.NullReferenceException 消息:对象引用未设置为对象的实例。 StackTrace:at System.Messaging.Cursor.Finalize()

这段代码多年来一直运行良好,但最近才开始运行。我已经重新启动了所有服务器来排除它,但这并没有帮助。

编辑1

下面是发送消息的代码。QueueFactory只是一个具有创建MessageQueue的锁的单例。

代码语言:javascript
复制
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的代码

代码语言:javascript
复制
lock (lockHandler)
{
    return new System.Messaging.MessageQueue(queuePath);
}
EN

回答 1

Stack Overflow用户

发布于 2013-01-11 14:53:07

尝试使用一个事务:

代码语言:javascript
复制
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();
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14126253

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档