c# .net windows消息队列简单应用示例

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
        {
            //提示生成失败,跳转到其它代码。
            //其它业务
        }
    }
}

 

posted @ 2015-01-16 11:26  Net-Spider  阅读(619)  评论(0)    收藏  举报