标签:
在项目中使用消息队列,可以对消息提供方和消息消费方进行解耦,提高系统的灵活性和可拓展性。其中,企业级的消息队列中间件有IBM WebSphere MQ、Tibco EMS、HornetQ等等。微软的Windows系统也自带了消息队列的功能,可以在“启动或关闭Windows功能”中开启:
开启后在服务中查看消息队列服务是否运行:
接下来是简单的消息队列操作:
using System; using System.Messaging; namespace MQ { class MQHelper { /// <summary> /// 创建一个消息队列 /// </summary> /// <param name="name">消息队列的名称</param> /// <returns>是否创建成功</returns> public static bool CreateNewMQ(string name) { if (!MessageQueue.Exists(".\\private$\\" + name)) { MessageQueue mq = MessageQueue.Create(".\\private$\\" + name); mq.Label = "private$\\" + name; return true; } else { return false; } } /// <summary> /// 删除一个消息队列 /// </summary> /// <param name="name">消息队列的名称</param> /// <returns>是否创建成功</returns> public static bool DeleteNewMQ(string name) { if (!MessageQueue.Exists(".\\private$\\" + name)) { MessageQueue.Delete(".\\private$\\" + name); return true; } else { return false; } } /// <summary> /// 发送消息到指定消息队列 /// </summary> /// <param name="mq_name">消息队列名称</param> /// <param name="msg_lable">消息头</param> /// <param name="msg_body">消息体</param> public static void SendMessage(string mq_name, string msg_lable, string msg_body) { MessageQueue mq = new MessageQueue(@".\private$\" + mq_name); Message message = new Message(); message.Label = msg_lable; message.Body = msg_body; mq.Send(message); } /// <summary> /// 从指定消息队列获取第一条消息 /// </summary> /// <param name="mq_name">消息队列名称</param> /// <returns>Message</returns> public static Message ReceiveMessage(string mq_name) { MessageQueue mq = new MessageQueue(@".\private$\" + mq_name); if (mq.GetAllMessages().Length > 0) { Message message = mq.Receive(); if (message != null) { message.Formatter = new System.Messaging.XmlMessageFormatter(new Type[] { typeof(string) }); } return message; } else { return null; } } } }
在WPF中调用写好的方法:
using System; using System.Timers; using System.Windows; namespace MQ { public partial class MainWindow : Window { private static readonly string mq_name = "textMQ"; private Timer timer; public MainWindow() { InitializeComponent(); MQHelper.CreateNewMQ(mq_name); timer = new Timer(); timer.Interval = 1000; timer.Elapsed += new System.Timers.ElapsedEventHandler(flash); timer.Start(); } private void Button_Click(object sender, RoutedEventArgs e) { string mq_content = inputText.Text; //发送一条消息到消息队列 MQHelper.SendMessage(mq_name, "test", mq_content); } //循环获取消息队列中的消息,并展现到TextBox中 private void flash(object sender, ElapsedEventArgs e) { var message = MQHelper.ReceiveMessage(mq_name); if (message != null) { Action hide = delegate() { outputText.Text += message.Id + " " + message.Label + " " + message.Body + "\n"; }; this.Dispatcher.BeginInvoke(hide); } } } }
运行结果:
标签:
原文地址:http://www.cnblogs.com/sxxsw/p/5061259.html