编写MSMQ示例应用程序所需的最低限度

我一直在研究一个多小时,并find了如何在C#中使用MSMQ,甚至是关于消息队列的一本书的完整章节…但是对于一个快速testing,我需要覆盖的是这种情况,甚至不是在一个完美的方式,只是一个快速演示:

“应用程序A”:将消息写入消息队列。 (应用程序A是一个C#窗口服务)现在我打开“应用程序B”(这是一个C#winForms应用程序),我检查MSMQ,我看到哦,我有一个新的消息。

就是这样…我需要一个简单的演示。

任何人都可以请帮我一个这样的代码示例? 非常感激。

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

对于更复杂的场景,您可以使用Message对象发送消息,将自己的类对象封装在其中,并将您的类标记为可序列化。 另外请确保您的系统上安装了MSMQ

也许下面的代码将是有用的只是快速介绍MSMQ

所以你必须在解决scheme3的应用程序中创build。

  1. MessageTo(Windows窗体)添加1个button。
  2. MessageFrom(Windows Form)添加1个richtextbox。
  3. MyMessage(类库)添加1个类。

只要复制过去的代码,并尝试。 请注意, MSMQ安装在您的MS Windows上,并且项目1和2具有参考System.Messaging

1. MessageTo(Windows窗体)添加1个button。

 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)添加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(类库)添加1个类。

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

请享用 :)