http://blog.csdn.net/nyzfl/article/details/1537136
1. 消息隊列(Message Queue):
{
//Open Queue
System.Messaging.MessageQueue queue=new System.Messaging.MessageQueue("./Private$/MSMQDemo");
//Create Message
System.Messaging.Message message=new System.Messaging.Message();
message.Body=txtMessage.Text.Trim();
message.Formatter=new System.Messaging.XmlMessageFormatter(new Type[]{typeof(string)});
//Put Message Into Queue
queue.Send(message);
}
//同步接收
private void btnReceiveMessage_Click(object sender, System.EventArgs e)
{
try
{
//Open Queue
System.Messaging.MessageQueue queue=new System.Messaging.MessageQueue("./Private$/MSMQDemo");
//Receive message,同步的Receive方法阻塞當前執行線程,直到一個message可以得到
lock(queue)
{
System.Messaging.Message message=queue.Receive(new TimeSpan(0,0,0,1),System.Messaging.MessageQueueTransactionType.Single);
message.Formatter=new System.Messaging.XmlMessageFormatter(new Type[]{typeof(string)});
txtReceiveMessage.Text=message.Body.ToString();
}
}
catch(System.Messaging.MessageQueueException ex)
{
//超時
MessageBox.Show(ex.MessageQueueErrorCode.ToString());
}
}
結束.
//異步接收
private void Receive1_Click(object sender, System.EventArgs e)
{
System.Messaging.MessageQueue mq1=new System.Messaging.MessageQueue("./Private$/MSMQDemo");
mq1.ReceiveCompleted+=new System.Messaging.ReceiveCompletedEventHandler(ReceiveEvt);
mq1.BeginReceive();
}
private void ReceiveEvt(object source,System.Messaging.ReceiveCompletedEventArgs asyncResult)
{
try
{
System.Messaging.MessageQueue mqReceive=(System.Messaging.MessageQueue)source;
System.Messaging.Message m=mqReceive.EndReceive(asyncResult.AsyncResult);
//此事m爲異步接收到的消息
//在此插入處理消息的代碼
m.Formatter=new System.Messaging.XmlMessageFormatter(new Type[]{typeof(string)});
txtReceiveMessage.Text=m.Body.ToString();
mqReceive.BeginReceive();//接收下一次事件
}
catch(System.Messaging.MessageQueueException e)
{
System.Windows.Forms.MessageBox.Show(e.MessageQueueErrorCode.ToString());
System.Windows.Forms.MessageBox.Show(e.Message);
}
}
好處:當第二次點發送消息的時候,自動接收。
D.在後臺寫的操作類。
/// 檢查隊列,如果隊列不存在,則建立
/// 隊列名稱
/// </summary>
/// <param name="path">路徑</param>
private static void EnsureQueueExists(string path)
{
if(!System.Messaging.MessageQueue.Exists(path))
{
System.Messaging.MessageQueue.Create(path);
System.Messaging.MessageQueue mqTemp=new System.Messaging.MessageQueue(path);
mqTemp.SetPermissions("Everyone",System.Messaging.MessageQueueAccessRights.FullControl);
///不知道該給什麼樣的權限好,所以就給了Everone全部權限了,當然大家最好自己控制一下
}
}
/// <summary>
/// 發送對象到隊列中
/// 隊列名稱,因爲隊列名稱在一個應用中應該不改變的,所以大家最好寫在配置文件中
/// 要發出去的對象
/// </summary>
/// <param name="QueuePath"></param>
/// <param name="MessageText"></param>
public static void SendQueue(string QueuePath,string MessageText)
{
System.Messaging.MessageQueue mqSend=new System.Messaging.MessageQueue(QueuePath,false);
EnsureQueueExists(QueuePath);
System.Messaging.Message sq=new System.Messaging.Message();
sq.Body=MessageText.Trim();
sq.Formatter=new System.Messaging.XmlMessageFormatter(new Type[]{typeof(string)});
mqSend.Send(sq);
}
/// <summary>
/// 從隊列中取出對象列表
/// 隊列名稱
/// 不知道怎麼用
/// </summary>
/// <param name="QueuePath"></param>
/// <returns></returns>
public static System.Collections.ArrayList GetMessage(string QueuePath)
{
System.Messaging.Message sq=new System.Messaging.Message();
System.Messaging.MessageQueue mq=new System.Messaging.MessageQueue(QueuePath,false);
mq.Formatter=new System.Messaging.XmlMessageFormatter(new Type[]{typeof(string)});
System.Messaging.Message[] arrM=mq.GetAllMessages();
mq.Close();
System.Collections.ArrayList al=new System.Collections.ArrayList();
foreach(System.Messaging.Message m in arrM)
{
sq=m.Body as System.Messaging.Message;
al.Add(sq);
}
return al;
}
/// <summary>
/// 得到計算機消息隊列中的數量,做循環進行計數
/// </summary>
/// <param name="QueuePath"></param>
/// <returns></returns>
public static uint Count(string QueuePath)
{
//變量,存放數量
uint numberItems=0;
//連接到隊列
System.Messaging.MessageQueue mq=new System.Messaging.MessageQueue(QueuePath);
System.Messaging.MessageEnumerator myEnumerator=mq.GetMessageEnumerator();
while(myEnumerator.MoveNext())
{
numberItems++;
}
return numberItems;
}
E.後臺寫的利用多線程監聽的操作類。
private string m_QueueName;
public bool flag=true;
/// <summary>
/// 重載構造函數,接收必要的隊列信息
/// </summary>
/// <param name="MachineName"></param>
/// <param name="QueueName"></param>
public MQListen(string MachineName,string QueueName)
{
m_MachineName=MachineName;
m_QueueName=QueueName;
}
public void Listen()
{
//創建一個MessageQueue對象
System.Messaging.MessageQueue MQ=new System.Messaging.MessageQueue();
//設置MessageQueue對象的路徑屬性
MQ.Path=m_MachineName+"/private$/"+m_QueueName;
//創建一個Message對象
System.Messaging.Message message=new System.Messaging.Message();
//重複上述步驟,直到收到中止
while(flag)
{
try
{
//休眠以在中斷髮出時捕捉中斷
System.Threading.Thread.Sleep(100);
//將Message對象設置爲與接收函數的結果相等
//持續時間(天,時,分鐘,秒)
message=MQ.Receive(new TimeSpan(0,0,10,10));
//顯示已接受消息的標籤
System.Windows.Forms.MessageBox.Show("Label:"+message.Label);
}
catch(System.Threading.ThreadInterruptedException e)
{
//從主線程捕捉ThreadInterrupt並退出
Console.WriteLine("Exiting Thread");
message.Dispose();
MQ.Dispose();
break;
}
catch(Exception GenericException)
{
// 捕捉接收過程中拋出的所有異常。
Console.WriteLine(GenericException.Message);
}
}
}
啓動和終止線程操作同步消息隊列:
簡單:
啓動: MultiThreadedMQListener.MQListen objMQListen=new WinFormExample1._0320.MultiThreadedMQListener.MQListen(".","MSMQDemo");
System.Threading.Thread thread=new System.Threading.Thread(new System.Threading.ThreadStart (objMQListen.Listen));
t.Start();
終止: MultiThreadedMQListener.MQListen objMQListen=new WinFormExample1._0320.MultiThreadedMQListener.MQListen(".","MSMQDemo");
objMQListen.flag=false;
複雜(線程池):
private void StartThreads()
{
int LoopCounter;//線程計數
StopListeningFlag=false;// 跟蹤輔助線程是否應當終止的標誌。
//將一個包含 5 個線程的數組聲明爲輔助線程。
Thread[] ThreadArray=new Thread[5];
//聲明包含輔助線程的所有代碼的類。
MQListen objMQListen=new MQListen(server.Text,Queue.Text);
for(LoopCounter=0;LoopCounter<ThreadArray.Length;LoopCounter++)
{
//創建一個 Thread 對象。
ThreadArray[LoopCounter]=new Thread(new ThreadStart(objMQListen.Listen));
//啓動線程將調用 ThreadStart 委託。
ThreadArray[LoopCounter].Start();
}
statusBar1.Text=LoopCounter.ToString()+" listener threads started";
while(!StopListeningFlag)
{
//等待用戶按下停止按鈕。
//在等待過程中,讓系統處理其他事件。
System.Windows.Forms.Application.DoEvents();
}
statusBar1.Text="Stop request received,stopping threads";
//向每個線程發送一箇中斷請求。
for(LoopCounter=0;LoopCounter<ThreadArray.Length;LoopCounter++)
{
ThreadArray[LoopCounter].Interrupt();
}
statusBar1.Text="All Threads have been Stopped";
}
private bool StopListeningFlag=false;
private void start_Click(object sender, System.EventArgs e)
{
statusBar1.Text="Starting Threads";
StartThreads();
}
private void stop_Click(object sender, System.EventArgs e)
{
StopListeningFlag=true;
}
異步操作消息隊列:
先聲明一個
System.Threading.ManualResetEvent socketEvent=new System.Threading.ManualResetEvent(false);
先socketEvent.Reset();
BeginReceive();監聽;
然後socketEvent.WaitOne();
回調函數中
先socketEvent.Set(); 然後使用EndReceive ()來完成數據報的接收