gpt4 book ai didi

c# - 我应该如何使用 MSMQ?

转载 作者:行者123 更新时间:2023-11-30 15:03:57 25 4
gpt4 key购买 nike

我编写了这段有效的代码,但它让我开始思考我应该如何使用 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();
}
}
}
}

最佳答案

一般来说,你应该让对象存活的时间越短越好。这是为了防止 .NET 垃圾收集器将这些对象从第 0 代移动到第 1 代等等。这将有助于减少内存消耗和垃圾回收次数。

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

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

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

关于性能,我认为您可能试图过早地进行优化。我建议分析您的软件(仅发布版本)并使其承受一些负载。这是您获得可靠答案的唯一途径。

关于c# - 我应该如何使用 MSMQ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10963980/

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