我该如何使用MSMQ?

时间:2012-06-09 19:35:57

标签: c# msmq

我写了这段代码,但它让我开始思考如何使用MSMQ: 我应该使用“using”语句来获取消息队列吗?当我完成它时,Using语句将处理删除队列,但是什么时候我完成它?我应该保存我的MessageQueue对象以供重用。可以说这是在ASP.Net应用程序中,我想从同一个动作向同一队列发送3条消息。保存对象并重新使用,或者像我现在一样创建和处理它?<​​/ p>

using (MessageQueue msgQueue = new MessageQueue(this.queueName))
{
    using (MessageQueueTransaction msgTx = new MessageQueueTransaction())
    {                      
        Message recoverableMessage = null;
        msgTx.Begin();
        try
        {
            recoverableMessage = new Message();
            recoverableMessage.Body = message;
            recoverableMessage.Formatter = new BinaryMessageFormatter(System.Runtime.Serialization.Formatters.FormatterAssemblyStyle.Simple, System.Runtime.Serialization.Formatters.FormatterTypeStyle.TypesAlways);
            recoverableMessage.Recoverable = true;

            msgQueue.Send(recoverableMessage, msgTx);
            ////this.msgQ.Send(recoverableMessage, msgTx); //whats up here??? this will teach me for taking time off. not sure whuc I shuold use
            msgTx.Commit();
            result = recoverableMessage.Id;
            //recoverableMessage.Dispose();
        }
        catch (Exception)
        {
            msgTx.Abort();
            ////recoverableMessage.Dispose();
        }
        finally
        {
            if (recoverableMessage != null)
            {
                recoverableMessage.Dispose();
            }
        }
    }
}

1 个答案:

答案 0 :(得分:5)

通常,您应该尽可能缩短对象的存活时间。这是为了防止.NET垃圾收集器将这些对象从第0代移动到第1代,依此类推。这将有助于减少内存消耗和垃圾收集的数量。

话虽如此,保持消息队列对象存活的唯一原因是将多个消息作为单个事务或范围的一部分发布到同一队列。

如果在单个页面请求期间发送了三条消息,那么您将创建消息队列的新实例,每次呈现页面时发送消息并处理队列。

修改
有关线程satefy等的详细信息,请参阅文档 例如,MSDN表示只有GetAllMessages方法是线程安全的。然后我假设API的其余部分不是线程安全的。但是,这仅表示多个线程不应同时访问单个MessageQueue对象实例。您可以创建多个MessageQueue实例,指向同一个队列。

关于性能,我认为您可能会尝试过早优化。我建议您分析您的软件(仅发布版本)并将其置于一定负载之下。这是你获得可靠答案的唯一方法。