現在我就繼續學習關於消息隊列的接收
先還是概念
消息的接收又分成同步和異步方式兩種,同步接收在規定時間內從消息隊列中取出收到的第一條消息,當消息隊列中沒有消息時,程序處於等待狀態;異步接收方式則是定義了一個事件處理函數,當消息隊列中第一個消息到達時立即觸發該函數。
接下來我就做個實驗:
{
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); //發送
}
然後我就做了同步接收的方法:
{
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();
}
然後我們在證實下“同步接收在規定時間內從消息隊列中取出收到的第一條消息,當消息隊列中沒有消息時,程序處於等待狀態” 。
大家有看到進度條嗎?它就一直在等待中,然後我再打開一個頁面,再發送一個消息,我們就能看到,他馬上就能接收
做完了同步的,然後我繼續在實驗異步的,看看消息隊列是怎麼操作的
{
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的代碼已經返回給客戶端了,不知道我這樣理解是否正確
今天只要是學習了同步和異步的接收消息,但是還有很多的問題還沒搞清楚,比如 消息的併發性,怎麼結合數據庫使用,怎麼樣發送複雜的消息等等,這些問題還有待解決
源碼下載