我学MSMQ(二)

简介:

上次我主要学习的是MSMQ的基本的概念、安装消息队列和新建了一个简单的队列。
      现在我就继续学习关于消息队列的接收

先还是概念
         消息的接收又分成同步和异步方式两种,同步接收在规定时间内从消息队列中取出收到的第一条消息,当消息队列中没有消息时,程序处于等待状态;异步接收方式则是定义了一个事件处理函数,当消息队列中第一个消息到达时立即触发该函数。 
接下来我就做个实验:

     private  void FSend()
     {
        string queuename = ".\\private$\\testQueue";//队列名称
        MessageQueue q;
        if (MessageQueue.Exists(queuename))
        {
            q = new System.Messaging.MessageQueue(queuename);
        }

        else
        {
            q = MessageQueue.Create(queuename);
        }

        Message m = new Message();
        m.Label = "MessageLabel";      //描述消息的字串
        m.Body = Send.Text;        //消息的主体
        q.Send(m);                      //发送
    }

发送消息,上次做过一个,很简单
然后我就做了同步接收的方法:

     private  void Recevie()
     {
        string queuename = ".\\private$\\testQueue";//队列名称
        MessageQueue q;
        q = new System.Messaging.MessageQueue(queuename);
        Message m = q.Receive();
        m.Formatter = new XmlMessageFormatter(new Type[] typeof(string) });
        Recieve.Text = m.Body.ToString();
    }

然后看结果

然后我们在证实下“同步接收在规定时间内从消息队列中取出收到的第一条消息,当消息队列中没有消息时,程序处于等待状态” 。

大家有看到进度条吗?它就一直在等待中,然后我再打开一个页面,再发送一个消息,我们就能看到,他马上就能接收
 
做完了同步的,然后我继续在实验异步的,看看消息队列是怎么操作的

     private  void RecevieAsynchronism()
     {
        string queuename = ".\\private$\\testQueue";                                 //队列名称
        MessageQueue q;
        q = new System.Messaging.MessageQueue(queuename);
        Message m=q.Peek();                                                           //不删除接收到的消息
                                                                                    
//被动方式,异步调用方式,不会阻塞当前线程
    q.ReceiveCompleted +=new ReceiveCompletedEventHandler( ReceivedEvt);            //事件
    q.BeginReceive(); 
                       
    }


     public   void ReceivedEvt( object source, ReceiveCompletedEventArgs asyncResult)
     {
        //其中ReceivedEvt要么为静态函数,要么必须是属于实例化的对象的可访问函数
        try
        {
            MessageQueue mq = (MessageQueue)source;
            Message m = mq.EndReceive(asyncResult.AsyncResult);
            //此事m为异步接收到的消息
            
//在此插入处理消息的代码 
            m.Formatter = new XmlMessageFormatter(new Type[] typeof(string) });
            t_Recieve.Text = m.Body.ToString();
            mq.BeginReceive();//接收下一次事件
        }

        catch (MessageQueueException)
        {

        }

        return;
    }


首先定义了一个事件,当第一个消息到达的时候,就触发事件,读取消息.首先我们先来看结果

我们按发送消息,然后在按接受消息,发现他竟然是等待,为什么呢?
下面是我个人的理解,不是对否,希望有人指出
首先在按发送消息的时候,其实就有了第一个消息,然后就触发了事件,已经把消息读了出来,所以在按接受按钮的时候,就没有了消息,就只能等待,可是还有个问题,既然实现了事件,那事件里面不是有对文本框进行赋值的吗?其实他只要是异步的原因,因为这个事件在后台运行的,真正的asp.net的代码已经返回给客户端了,不知道我这样理解是否正确

今天只要是学习了同步和异步的接收消息,但是还有很多的问题还没搞清楚,比如 消息的并发性,怎么结合数据库使用,怎么样发送复杂的消息等等,这些问题还有待解决

分类:  ASP.NET
本文转自左正博客园博客,原文链接:http://www.cnblogs.com/soundcode/p/3569710.html ,如需转载请自行联系原作者
相关文章
|
6月前
|
网络协议 算法 Linux
【嵌入式软件工程师面经】Linux网络编程Socket
【嵌入式软件工程师面经】Linux网络编程Socket
173 1
|
7月前
|
消息中间件 缓存 NoSQL
非常强悍的 RabbitMQ 总结,写得真好
非常强悍的 RabbitMQ 总结,写得真好
29 0
|
机器学习/深度学习 网络协议 Ubuntu
【Linux网络编程】网络编程初体验
【Linux网络编程】网络编程初体验
178 0
|
Linux
【Linux网络编程】服务端编程初体验
【Linux网络编程】服务端编程初体验
103 0
|
XML Java API
WebService学习笔记(一) 初遇篇
WebService学习笔记(一) 初遇篇
WebService学习笔记(一) 初遇篇
|
分布式计算 Dubbo 网络协议
RPC学习笔记初遇篇(一)
RPC学习笔记初遇篇(一)
RPC学习笔记初遇篇(一)
|
消息中间件 缓存 负载均衡
非常强悍的 RabbitMQ 总结,写得真好!
RabbitMQ是基于AMQP协议的,通过使用通用协议就可以做到在不同语言之间传递。
非常强悍的 RabbitMQ 总结,写得真好!
|
Web App开发 移动开发 JavaScript
补习系列(20)-大话 WebSocket 与 "尬聊"的实现
[TOC] 一、聊聊 WebSocket 从HTML5技术流行至今,WebSocket已经有非常广泛的应用: 在线游戏,提供实时的操作交互体验 社交平台,与好友实时的私信对话 新闻动态,获得感兴趣的主题信息推送 ... 这些场景,都需要服务器能主动实时的给浏览器或客户端推送消息,注意关键词是主动,还有实时!而在HTML5一统江湖之前,由于HTTP在推送场景下的"薄弱",我们需要借助一些复杂或者非标准的手段来实现。
1800 0
|
存储 JSON JavaScript
falcor扫盲篇
本文目的是介绍falcor的基本概念和工作原理,并演示如何在egg应用中引入falcor,使得读者能快速掌握falcor的基本用法。 # falcor是什么 falcor是介于客户端和服务端的数据中间件. 它把整个应用的域模型通过一个虚拟JSON对象表示,并抽象出get, set和call三种操作,使得应用程序可以用一种一致的方式读写域模型的数据,同时不用关注数据的来源。此外,falc
2663 0