c# - que - msmq windows 10
El mÃnimo necesario para escribir una aplicación de muestra MSMQ (2)
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.
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.
- MessageTo (Windows Form) Agregar 1 botón.
- MessageFrom (Windows Form) Agregue 1 richtextbox.
- 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 :)
//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