我學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的代碼已經返回給客戶端了,不知道我這樣理解是否正確

今天只要是學習了同步和異步的接收消息,但是還有很多的問題還沒搞清楚,比如 消息的併發性,怎麼結合數據庫使用,怎麼樣發送複雜的消息等等,這些問題還有待解決

源碼下載  
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章