【问题标题】:Listen to msmq queue监听 msmq 队列
【发布时间】:2012-05-24 00:17:45
【问题描述】:

下面是我用于监听来自 Windows 窗体的消息的代码。

我注意到,当我点击 send 时,它会向 MyQueue 发送一条消息,但当时我希望事件 mq_ReceiveCompleted(object sender, ReceiveCompletedEventArgs e) 应该被调用,但事实并非如此,换句话说,我正在尝试订阅 MyQueue从 Windows 窗体。只是想知道我是否在代码中遗漏了什么:

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());
    }
}

【问题讨论】:

  • 您需要学习发布相关代码 - 而不仅仅是您的整个代码文件!将您的代码缩减为仅对问题非常重要的那些方法/行 - 不要发布所有 Windows 窗体生成的代码 - 这根本不会为您的帖子增加任何价值.....

标签: msmq


【解决方案1】:

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(); 移动到 btnRcv_Click() 代替 .Receive()

【讨论】:

  • 嗨 Campbell,这里是修改后的代码:它仅在应用启动时触发此代码,而不是在您单击按钮时触发。 static void mq_ReceiveCompleted(object sender, ReceiveCompletedEventArgs e) { MessageBox.Show("Sai"); } 如果你有任何建议,请告诉我。谢谢
猜你喜欢
  • 2015-02-07
  • 1970-01-01
  • 2011-01-10
  • 2019-07-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-15
  • 1970-01-01
相关资源
最近更新 更多