2010-07-14 109 views
1

以下是我用于收听Windows窗体消息的代码。收听msmq队列

我注意到,当我点击send它发送消息给MyQueue,但当时我希望事件mq_ReceiveCompleted(object sender, ReceiveCompletedEventArgs e)应该被调用,但它不是,换句话说,我试图从Windows窗体订阅MyQueue 。只是想知道我是否遗漏了代码中的某些东西:

public class Form1 : System.Windows.Forms.Form 
{ 
    public System.Messaging.MessageQueue mq; 
    public static Int32 j=0; 

    public Form1() 
    { 
     // Required for Windows Form Designer support 
     InitializeComponent(); 

     // Queue Creation 
     if(MessageQueue.Exists(@".\Private$\MyQueue")) 
     mq = new System.Messaging.MessageQueue(@".\Private$\MyQueue"); 
     else 
     mq = MessageQueue.Create(@".\Private$\MyQueue"); 

     mq.ReceiveCompleted += new ReceiveCompletedEventHandler(mq_ReceiveCompleted); 
     mq.BeginReceive(); 
    } 

    [STAThread] 
    static void Main() 
    { 
     Application.Run(new Form1()); 
    } 

    private void btnMsg_Click(object sender, System.EventArgs e) 
    { 
     // SendMessage(Handle, 1, 0, IntPtr.Zero); 
     System.Messaging.Message mm = new System.Messaging.Message(); 
     mm.Body = txtMsg.Text; 
     mm.Label = "Msg" + j.ToString(); 
     j++; 
     mq.Send(mm); 
    } 

    void mq_ReceiveCompleted(object sender, ReceiveCompletedEventArgs e) 
    { 
     //throw new NotImplementedException(); 
    } 

    private void btnRcv_Click(object sender, System.EventArgs e) 
    { 
     System.Messaging.Message mes; 
     string m; 

     try 
     { 
      mes = mq.Receive(new TimeSpan(0, 0, 3)); 
      mes.Formatter = new XmlMessageFormatter(new String[] {"System.String,mscorlib"}); 
      m = mes.Body.ToString(); 
     } 
     catch 
     { 
      m = "No Message"; 
     } 
     MsgBox.Items.Add(m.ToString()); 
    } 
} 
+1

您需要学习发布**相关代码** - 不只是您的整个代码文件!减少你的代码到那些对于这个问题非常重要的方法/行 - 不要发布所有Windows窗体生成的代码 - 它不会为你的文章增加任何价值..... – 2010-07-14 16:40:12

+0

对不起马克。 – 2010-07-14 17:35:53

回答

2

请参阅MSDN's example on how to use the ReceiveCompletedEventHandler

他们有一个控制台应用程序,其中Main()Form1()的作用相同,但您的处理程序没有任何代码。你已经说过它不会回调你的事件委托,但是也许在构造函数中检查你的队列名是否正确。

使用一个新的控制台应用程序 MSDN的示例代码首先测试您的环境,然后回到你的WinForms代码与任何教训考虑

private static void MyReceiveCompleted(Object source, 
     ReceiveCompletedEventArgs asyncResult) 
    { 
     MessageQueue mq = (MessageQueue)source; 
     Message m = mq.EndReceive(asyncResult.AsyncResult); 

     Console.WriteLine("Message: " + (string)m.Body); 
     mq.BeginReceive();  
     return; 
    } 

如果要检查队列并获得一个点击按钮的消息,你可以简单地声明mq.BeginReceive();移动到位的.Receive()btnRcv_Click();

+0

嗨坎贝尔 这里是修改后的代码: 它只在应用程序启动时触发此代码,而不是当您单击按钮时。 static void mq_ReceiveCompleted(object sender, ReceiveCompletedEventArgs e) { MessageBox.Show("Sai"); } 请让我知道,如果你有任何建议。 谢谢 – 2010-07-14 17:38:06