c# .net windows消息队列简单应用示例
1、机器上需要先安装好消息队列
2、开启一个监听消息队列的程序,程序一直从消息队列中获取消息,然后进行处理。 程序核心代码如下:
//初始化消息队列 //定义一个消息队列变量 MessageQueue mymsmq; string strMSMQPath = "消息队列名称如(.\Private$\CNKIFlashViewer)"; if (MessageQueue.Exists(strMSMQPath)) { this.mymsmq = new MessageQueue(strMSMQPath); } else { this.mymsmq = MessageQueue.Create(strMSMQPath); } this.mymsmq.SynchronizingObject = this; this.mymsmq.Formatter = new XmlMessageFormatter(new Type[] { typeof(MSMQOrder) }); //开启一个线程 Thread trd = new Thread(this.trd_Task); trd.IsBackground = true; trd.Start(); //线程执行函数 static object o = new object(); //线程处理消息实体 private void trd_Task() { lock (o) { while (true) { //flag_stop标记是否停止 if (this.flag_stop) break; //Order为定义的一个类,保存消息实体 Order order = null; this.mutex_msmq.WaitOne(); try { System.Messaging.Message msg = this.mymsmq.Receive(new TimeSpan(0, 0, 1)); order = (Order)msg.Body; } catch { } this.mutex_msmq.ReleaseMutex(); if (order == null) continue; TimeSpan ts = DateTime.Now - order.orderTime; //判断是否超时 if (ts.TotalSeconds > this.timeout) { continue; } try { //进行业务处理 } catch { } } } } #endregion //消息实体 [Serializable] public class Order { public int Type { get; set; } public string Url { get; set; }// public DateTime orderTime; }
3、发送消息队列的方法
public void SendMSMQ(string strUrl) { string strMSMQPath = ".\Private$\CNKIFlashViewer"; MessageQueue mq = null; if (MessageQueue.Exists(strMSMQPath)) { mq = new MessageQueue(strMSMQPath); } else { //可以创建 //mq = MessageQueue.Create(strMSMQPath); return; } mq.Formatter = new XmlMessageFormatter(new Type[] { typeof(MSMQOrder) }); MessageEnumerator enumerator = mq.GetMessageEnumerator2(); bool isExist = false; while (enumerator.MoveNext()) { Message msg = (Message)(enumerator.Current); MSMQOrder temp = (MSMQOrder)(msg.Body); if (temp.Url == strUrl) { isExist = true; break; } } if (!isExist) { MSMQOrder msoder = new MSMQOrder(); msoder.Type = 1; msoder.Url = strUrl; msoder.orderTime = DateTime.Now; mq.Send(msoder); } }
4、应用消息队列
在需要发送消息队列的代码处加下 SendUrl(strurl)即可,然后程序等待一定时间,验证消息执行结果
//发送消息 SendUrl(strurl); //等待30秒 int retryTimers = 30; string strFileNameFullPath = @"D:\3.doc"; for (int i = 0; i < retryTimers; i++) { Thread.Sleep(1000); //如验证一个文件是否生成 if (FileHelper.IsExist(strFileNameFullPath, false)) { //提示文件生成或进行其它业务处理 break; } else { if (i < retryTimers - 1) continue; else { //提示生成失败,跳转到其它代码。 //其它业务 } } }