2017-06-29 63 views
0

我已经创建了自己的MSMQ包装类是这样的:C#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

我认为第一个应用程序不应该听新的消息。它有可能从第二个应用程序中删除消息。它应该只发送消息。 – Sven

+0

@Sven,当分成发件人和接收器,它肯定按预期工作:)感谢提示。 – pitersmx

+0

很高兴为您效劳。我将发布这个答案。 – Sven

回答

1

我认为第一个应用程序不应该听新的消息。它有可能会带走第二个应用的消息。它应该只发送消息。

当你拆分功能它应该工作。