Слушайте msmq очередь

После кода я имею для слушания сообщений от формы 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
задан marc_s 14 July 2010 в 16:39
поделиться

1 ответ

Смотрите пример 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();

2
ответ дан 2 September 2019 в 23:03
поделиться