我有一个mainform,它发送消息和随机数量的接收表单作为单独的应用程序运行(C#4.0)。
每当有一个随机数量的表单接收到该消息但收到的消息时,其他表单将不再接收该消息。
我已尝试使用UDP,TCP IP,MSMQ,但我似乎并没有让它运行良好。发送方和接收方在同一系统上运行。
任何人都可以推荐我一种方式来广播一种消息,这种消息一直保留在一个队列中,直到所有表单都收到它,或者它可以保留在队列中直到应用程序关闭,但是如何......?
先谢谢大家!
亲切的问候 韦斯利
答案 0 :(得分:5)
您可以使用 MSMQ with Multicast 选项(在尝试之前检查您的Windows安装是否具有该选项,您可以在Windows控制面板的“添加/删除Windows功能”部分找到它)
使用MSMQ多播队列的发件人将提交可由许多MSMQ多播队列接收器处理的消息。
读者必须有一个私人队列,然后你需要设置你想要使用的多播地址(多播地址的选择是任意的,这就是为什么你经常会看到不同帖子中提到的相同地址,见有关更多信息的msdn文档),如下所示:
var myQueue = MessageQueue.Create(".\private$\MulticastTest", false);
myQueue.MulticastAddress = "234.1.1.1:8001";
或直接使用现有的多播队列(如果已使用多播地址创建)标准方式:
var myQueue = new MessageQueue(multicastQueueName());
然后你将不得不使用首选方法收听新消息,我更喜欢使用这个:
myQueue.Formatter = new XmlMessageFormatter(new Type[] { typeof(String) });
myQueue.PeekCompleted += new PeekCompletedEventHandler(QueuePeekCompleted);
myQueue.BeginPeek();
委托QueuePeekCompleted看起来像这样:
private void QueuePeekCompleted(object sender, PeekCompletedEventArgs e)
{
try
{
var message = myQueue.EndPeek(e.AsyncResult);
//LogInfo("Received this : " + message.Body);
}
catch (Exception ex)
{
//LogError(ex);
}
myQueue.Receive();
myQueue.BeginPeek();
}
多播消息的发送方必须连接到多播队列,如下所示:
MessageQueue myQueue = new MessageQueue("formatname:multicast=234.1.1.1:8001");
然后像往常一样发送消息:
myQueue.Send("hey listen!");
答案 1 :(得分:2)
您要查找的消息传递模式称为publish-subscribe。 MSMQ本身不支持此消息传递模式。
但是,有许多开源工具可以包括RabbitMQ和NServiceBus。