3

我编写了这段代码,但它让我开始思考应该如何使用 MSMQ:我应该使用“使用”语句来获取消息队列吗?Using 语句将在我完成队列时处理它,但我什么时候完成它?我应该保存我的 MessageQueue 对象以供重用。假设这是在 ASP.Net 应用程序中,我想从同一个操作将 3 条消息发送到同一个队列。像我现在一样保存对象并重用或创建和处置?

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();
            }
        }
    }
}
4

1 回答 1

5

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

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

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

编辑
有关线程安全等的详细信息,您应该参考文档。
例如,MSDN说只有GetAllMessages方法是线程安全的。然后我会假设 API 的其余部分不是线程安全的。但是,这仅意味着MessageQueue不应由多个线程同时访问对象的单个实例。您可以创建多个MessageQueue指向同一个队列的实例。

关于性能,我认为您可能正在尝试过早地进行优化。我建议分析您的软件(仅发布版本)并将其置于一些负载下。只有这样,您才能得到可靠的答案。

于 2012-06-12T10:15:15.730 回答