2

我有一个发送消息的主窗体和作为单独应用程序运行的随机数量的接收窗体(C# 4.0)。

每次随机数量的表单之一收到消息,但收到消息后,其他表单将不再收到消息。

我已经用 UDP、TCP IP、MSMQ 试过这个,但我似乎没有让它运作良好。发送者和接收者在同一个系统上运行。

谁能推荐我一种方法来广播一条消息,该消息一直保留在某种队列中,直到所有表单都收到它,或者它可以保留在该队列中直到应用程序关闭,但是如何...?

在此先感谢人们!

亲切的问候韦斯利

4

2 回答 2

5

组播 MSMQ

您可以将MSMQ 与多播选项一起使用(在尝试之前检查您的 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!");
于 2016-09-13T16:18:59.357 回答
2

您正在寻找的消息传递模式称为发布-订阅。MSMQ 本身不支持这种消息传递模式。

但是有许多开源工具,包括RabbitMQNServiceBus

于 2012-05-31T10:31:16.260 回答