2017-06-29 93 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

我認爲第一個應用程序不應該聽新的消息。它有可能會帶走第二個應用的消息。它應該只發送消息。

當你拆分功能它應該工作。