c#MSMQ介于两个未收到所有已发送邮件的本地应用程序之间

时间:2017-06-29 15:38:11

标签: c# msmq

我已经创建了我自己的MSMQ包装类,如下所示:

public class MsgQueue
{
    private MessageQueue messageQueue;

    public delegate void ReadMessageDelegate(string message);
    public event ReadMessageDelegate NewMessageAvailable;

    public MsgQueue(string queueName)
    {
        var queuePath = @".\Private$\" + queueName;

        if (!MessageQueue.Exists(queuePath)) MessageQueue.Create(queuePath);

        messageQueue = new MessageQueue(queuePath);
        messageQueue.Label = queueName;
        messageQueue.Formatter = new XmlMessageFormatter(new Type[] { typeof(string)});

        messageQueue.ReceiveCompleted += new ReceiveCompletedEventHandler(MsgReceivedHandler);
        messageQueue.BeginReceive();
    }

    private void MsgReceivedHandler(object sender, ReceiveCompletedEventArgs e)
    {
        try
        {
            MessageQueue mq = (MessageQueue)sender;
            var message = mq.EndReceive(e.AsyncResult);

            NewMessageAvailable(message.Body.ToString());

            mq.BeginReceive();
        }
        catch (MessageQueueException)
        {
            // Handle sources of MessageQueueException.
        }

        return;
    }

    public void SendMessage(string message)
    {
        messageQueue.Send(message);
    }
}

我在两个单独的WinForms应用程序上测试了它。

第一个应用在点击按钮时发送短信:

private void btn_Click(object sender, EventArgs e)
{          
   var queue = new MsgQueue.MsgQueue("GBMqueue");
   queue.SendMessage("some message text");
}

第二个应用正在侦听任何传入的消息,然后尝试处理它:

// declaration
private MsgQueue queue;

// preparation of the queue
private void Form1_Load(object sender, EventArgs e)
{
    queue = new MsgQueue.MsgQueue("GBMqueue");
    queue.NewMessageAvailable += Queue_NewMessageAvailable;
}

// Handler for the incoming messages
private void Queue_NewMessageAvailable(string message)
{
     // Hits here very rarely!!!
}

问题是我可以多次从App1发送消息,但Queue_NewMessageAvailable处理程序只捕获一条随机消息,而不是第一条消息 - 只发送一条消息。

没有抛出异常,它只是没有捕获传入的消息。

我在这里做错了什么?

1 个答案:

答案 0 :(得分:1)

我认为第一个App不应该收听新消息。它可能会夺走第二个App的消息。它应该只发送消息。

当您拆分功能时,它应该可以工作。