我学MSMQ(二)
? 上次我主要學習的是MSMQ的基本的概念、安裝消息隊列和新建了一個簡單的隊列。
??????現(xiàn)在我就繼續(xù)學習關(guān)于消息隊列的接收先還是概念?????????消息的接收又分成同步和異步方式兩種,同步接收在規(guī)定時間內(nèi)從消息隊列中取出收到的第一條消息,當消息隊列中沒有消息時,程序處于等待狀態(tài);異步接收方式則是定義了一個事件處理函數(shù),當消息隊列中第一個消息到達時立即觸發(fā)該函數(shù)。?接下來我就做個實驗:
發(fā)送消息,上次做過一個,很簡單然后我就做了同步接收的方法:
????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();????}然后看結(jié)果
然后我們在證實下“同步接收在規(guī)定時間內(nèi)從消息隊列中取出收到的第一條消息,當消息隊列中沒有消息時,程序處于等待狀態(tài)” 。大家有看到進度條嗎?它就一直在等待中,然后我再打開一個頁面,再發(fā)送一個消息,我們就能看到,他馬上就能接收做完了同步的,然后我繼續(xù)在實驗異步的,看看消息隊列是怎么操作的 ????private?void?RecevieAsynchronism()????{????????string?queuename?=?".\\private$\\testQueue";?????????????????????????????????//隊列名稱????????MessageQueue?q;????????q?=?new?System.Messaging.MessageQueue(queuename);????????Message?m=q.Peek();???????????????????????????????????????????????????????????//不刪除接收到的消息????????????????????????????????????????????????????????????????????????????????????//被動方式,異步調(diào)用方式,不會阻塞當前線程????q.ReceiveCompleted?+=new?ReceiveCompletedEventHandler(?ReceivedEvt);????????????//事件????q.BeginReceive();????????????????????????????}????public??void?ReceivedEvt(object?source,?ReceiveCompletedEventArgs?asyncResult)????{????????//其中ReceivedEvt要么為靜態(tài)函數(shù),要么必須是屬于實例化的對象的可訪問函數(shù)????????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;????}首先定義了一個事件,當?shù)谝粋€消息到達的時候,就觸發(fā)事件,讀取消息.首先我們先來看結(jié)果
我們按發(fā)送消息,然后在按接受消息,發(fā)現(xiàn)他竟然是等待,為什么呢?下面是我個人的理解,不是對否,希望有人指出首先在按發(fā)送消息的時候,其實就有了第一個消息,然后就觸發(fā)了事件,已經(jīng)把消息讀了出來,所以在按接受按鈕的時候,就沒有了消息,就只能等待,可是還有個問題,既然實現(xiàn)了事件,那事件里面不是有對文本框進行賦值的嗎?其實他只要是異步的原因,因為這個事件在后臺運行的,真正的asp.net的代碼已經(jīng)返回給客戶端了,不知道我這樣理解是否正確今天只要是學習了同步和異步的接收消息,但是還有很多的問題還沒搞清楚,比如 消息的并發(fā)性,怎么結(jié)合數(shù)據(jù)庫使用,怎么樣發(fā)送復雜的消息等等,這些問題還有待解決總結(jié)
- 上一篇: 信用卡滞纳金高的离谱 这种设定真的合理吗
- 下一篇: 工作组模式下专用队列(Private Q