Прослушивание очереди msmq - PullRequest
1 голос
/ 14 июля 2010

Ниже приведен код для прослушивания сообщений из формы 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());
    }
}

1 Ответ

2 голосов
/ 14 июля 2010

См. Пример MSDN о том, как использовать 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();

...