El mínimo necesario para escribir una aplicación de muestra MSMQ

He estado investigando durante más de una hora y he encontrado excelentes ejemplos de cómo usar MSMQ en C # e incluso un capítulo completo de un libro sobre Message Queue … Pero para una prueba rápida, todo lo que necesito es cubrir este escenario, ni siquiera de manera perfecta, solo para una demostración rápida:

“Aplicación A”: escribe un mensaje a Message Queue. (La aplicación A es un servicio de Windows C) Ahora abro la “Aplicación B” (es una aplicación winForms de C #) y consulto MSMQ y veo que tengo un nuevo mensaje.

Eso es todo lo que necesito para una demostración simple.

¿Alguien podría ayudarme con una muestra de código para esto? Muy apreciado.

//From Windows Service, use this code MessageQueue messageQueue = null; if (MessageQueue.Exists(@".\Private$\SomeTestName")) { messageQueue = new MessageQueue(@".\Private$\SomeTestName"); messageQueue.Label = "Testing Queue"; } else { // Create the Queue MessageQueue.Create(@".\Private$\SomeTestName"); messageQueue = new MessageQueue(@".\Private$\SomeTestName"); messageQueue.Label = "Newly Created Queue"; } messageQueue.Send("First ever Message is sent to MSMQ", "Title"); 

 //From Windows application MessageQueue messageQueue = new MessageQueue(@".\Private$\SomeTestName"); System.Messaging.Message[] messages = messageQueue.GetAllMessages(); foreach (System.Messaging.Message message in messages) { //Do something with the message. } // after all processing, delete all the messages messageQueue.Purge(); 

Para situaciones más complejas, puede usar los objetos de mensaje para enviar el mensaje, ajustar su propio objeto de clase dentro de él y marcar su clase como serializable. También asegúrese de que MSMQ esté instalado en su sistema

Quizás el siguiente código sea útil para que alguien obtenga una introducción rápida a MSMQ .

Entonces debes crear en la solución 3 aplicaciones.

  1. MessageTo (Windows Form) Agregar 1 botón.
  2. MessageFrom (Windows Form) Agregue 1 richtextbox.
  3. MyMessage (Class Library) Agregue 1 clase.

Solo copie el código anterior y pruébelo. Asegúrese de que MSMQ esté instalado en su MS Windows y los proyectos 1 y 2 tengan referencia a System.Messaging .

1. MessageTo (Windows Form) Agregar 1 botón.

 using System; using System.Messaging; using System.Windows.Forms; namespace MessageTo { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { #region Create My Own Queue MessageQueue messageQueue = null; if (MessageQueue.Exists(@".\Private$\TestApp1")) { messageQueue = new MessageQueue(@".\Private$\TestApp1"); messageQueue.Label = "MyQueueLabel"; } else { // Create the Queue MessageQueue.Create(@".\Private$\TestApp1"); messageQueue = new MessageQueue(@".\Private$\TestApp1"); messageQueue.Label = "MyQueueLabel"; } #endregion MyMessage.MyMessage m1 = new MyMessage.MyMessage(); m1.BornPoint = DateTime.Now; m1.LifeInterval = TimeSpan.FromSeconds(5); m1.Text = "Command Start: " + DateTime.Now.ToString(); messageQueue.Send(m1); } } } 

2. MessageFrom (Windows Form) Agregue 1 richtextbox.

 using System; using System.ComponentModel; using System.Linq; using System.Messaging; using System.Windows.Forms; namespace MessageFrom { public partial class Form1 : Form { Timer t = new Timer(); BackgroundWorker bw1 = new BackgroundWorker(); string text = string.Empty; public Form1() { InitializeComponent(); t.Interval = 1000; t.Tick += T_Tick; t.Start(); bw1.DoWork += (sender, args) => args.Result = Operation1(); bw1.RunWorkerCompleted += (sender, args) => { if ((bool)args.Result) { richTextBox1.Text += text; } }; } private object Operation1() { try { if (MessageQueue.Exists(@".\Private$\TestApp1")) { MessageQueue messageQueue = new MessageQueue(@".\Private$\TestApp1"); messageQueue.Formatter = new XmlMessageFormatter(new Type[] { typeof(MyMessage.MyMessage) }); System.Messaging.Message[] messages = messageQueue.GetAllMessages(); var isOK = messages.Count() > 0 ? true : false; foreach (System.Messaging.Message m in messages) { try { var command = (MyMessage.MyMessage)m.Body; text = command.Text + Environment.NewLine; } catch (MessageQueueException ex) { } catch (Exception ex) { } } messageQueue.Purge(); // after all processing, delete all the messages return isOK; } } catch (MessageQueueException ex) { } catch (Exception ex) { } return false; } private void T_Tick(object sender, EventArgs e) { t.Enabled = false; if (!bw1.IsBusy) bw1.RunWorkerAsync(); t.Enabled = true; } } } 

3. MyMessage (Class Library) Agregue 1 clase.

 using System; namespace MyMessage { [Serializable] public sealed class MyMessage { public TimeSpan LifeInterval { get; set; } public DateTime BornPoint { get; set; } public string Text { get; set; } } } 

Disfruta 🙂