• ASP.NET中进行消息处理(MSMQ) 三


    摘抄自:http://www.cnblogs.com/beniao/archive/2008/07/04/1234352.html

     在本文的前两篇文章里对MSMQ的相关知识点进行了介绍,很多阅读过这前两篇文章的朋友都曾问到过这样一些问题:   1、如何把MSMQ应用到实际的项目中去呢?   2、可不可以介绍一个实际的应用实例?   3、......

          在前两篇文章里,关于MSMQ常用的技术点基本介绍完毕了,本文主要以MS开源项目PetShop中的MSMQ应用作为案例来介绍MSMQ在实际项目中的应用。在PetShop里,由于系统使用了多线程的专用应用程序来监控消息队列,在进入PetShop应用分析前,我们先来了解下关于多线程和MSMQ的相关知识点。
    一、多线程和MSMQ       现在有这样一个需求,指定的消息队列里不管有无消息数据,我们通过一个多线程来监控这个队列,一但队列里的数据发生变化就做出相应的处理,比如把消息读取出来。根据这个需求,我们来做个示例,用一多线程把队列监控起来,如果队列里有消息数据,就把消息读取出来,如果没有则一直监视队列,当队列数据发生改变(有新的消息加入)的时候就作出处理(读取消息)。

            public static int threadNumber = 5;//5个线程
    public static Thread[] ThreadArray = new Thread[threadNumber];

     我们把需要启动的线程装载入ThreadArray数组,通过一个遍历数组把所以的线程启动,实际这里只有5个线程。

            private void StartThreads()
    {
    for (int conter = 0; conter < threadNumber; conter++)
    {
    ThreadArray[conter] = new Thread(new ThreadStart(listMessage));
    ThreadArray[conter].Name = conter.ToString();
    ThreadArray[conter].Start();
    richTextBox1.Text += conter.ToString() + "线程已经运行</br>";
    }
    }
    //开始监听
    private void listent_Click(object sender, EventArgs e)
    {
    StartThreads();
    }

    //停止监听
    private void stop_Click(object sender, EventArgs e)
    {
    for (int conter = 0; conter < threadNumber; conter++)
    {
    ThreadArray[conter].Abort();
    richTextBox2.Text += conter.ToString() + "线程已经停止</br>";
    }
    }
    private void listMessage()
    {
    while (true)
    {
    //取出队列里的消息
    MessageBox.Show(MSMQManger.ReceiverMessage());
    }

    }

    如果上面这段代码阅读起存在问题,建议先去了解下多线程的相关知识点。在StartThreads方法里启动数组里存储的所以线程,并委托给MSMQListen方法进行处理,MSMQListen方法完成的就是读取队列里的消息,这里我使用了在第二篇文章里所使用的MsgQueue类和Book类,详细请阅读第二篇文章ASP.NET中进行消息处理(MSMQ) 二 。                                     启动了5个线程,用来监视指定的消息队列,如上图。那好,我们现在就来测试一下,通过给队列里发送消息,看线程是否会有响应。从上面启动线程的代码上可以很清晰的看出,只要队列里有消息在多线程的监视下,线程就会把队列里的消息读取出来。

    发送消息:

            private void button3_Click(object sender, EventArgs e)
    {
    MSMQManger.SendQueue("标题", "我是发送的信息");
    }

    记住在窗体关闭时候,一定要释放信息队列资源,要不线程是未终止的:

           ///<summary>
    /// 删除消息队列
    ///</summary>
    public static void CloseAllMessage()
    {
    //连接到本地队列

    MessageQueue.Delete(@".\private$\myQueue");

    }



  • 相关阅读:
    The user specified as a definer (”@’%') does not exist解决方法
    mongodb下载地址
    镜像系统,超好用
    部署mysql后,无法设置用户远程登陆(%只所有用户,不可以,只能给指定的ip?)
    Libcap的简介及安装
    GCC命令基础
    gcc安装(centos)
    React Native 踩坑
    webpack 和 babel
    React 开发笔记
  • 原文地址:https://www.cnblogs.com/zhijianliutang/p/2252549.html
Copyright © 2020-2023  润新知