使用訊息傳遞資料時,一般情況下資料量較少。在我所使用的項目中,使用它最大的好處就是不用考慮對方是否是運行狀態,只要對方上線,它就可能收到。在項目中,它的作用是在產生較大的資料時,先用訊息進行通知,在對方收到訊息後,再從Web服務來收取,代碼如下,有改動:
發送端:
1 messageModel.transfersModel tmodel = new messageModel.transfersModel(sourcetext.Trim(), itype, content.Trim());
2 using (MessageQueue queue = new MessageQueue("FormatName:DIRECT=tcp:" + address.Trim() + @"\Private$\message"))
3 {
4 MessageQueueTransaction transMes = new MessageQueueTransaction();
5 try
6 {
7 transMes.Begin();
8 queue.Send(tmodel, "transferMessage : { " + sourceip.Trim() + " }");
9 transMes.Commit();
10 }
11 catch
12 {
13 transMes.Abort();
14 }
15 }
16
接收端:
1 private Thread receiveMessageThread;
2
3 private void Form_Load(object sender, EventArgs e)
4 {
5 /**////接收訊息
6 this.queue = new MessageQueue(@".\Private$\tgatemessage");
7 System.Type[] types = new Type[] { typeof(messageModel.transfersModel) };
8 queue.Formatter = new XmlMessageFormatter(types);
9
10 this.receiveMessageThread = new Thread(new ThreadStart(this.getMessage));
11 this.receiveMessageThread.IsBackground = true;
12 this.receiveMessageThread.Start();
13 }
14
15
16
17 接收訊息#region 接收訊息
18 private MessageQueue queue;
19 /**//// <summary>
20 /// 取訊息
21 /// </summary>
22 private void getMessage()
23 {
24 while (true)
25 {
26 MessageEnumerator messageEnum = queue.GetMessageEnumerator2();
27 {
28 while (messageEnum.MoveNext())
29 {
30 System.Messaging.Message message = queue.PeekById(messageEnum.Current.Id);
31 messageModel.transfersModel tmodel = message.Body as messageModel.transfersModel;
32 if (tmodel != null)
33 {
34 //取資料並儲存
35 //調用方法將資料儲存,如果正常儲存則將對應訊息資料清除
36 //if(new dataFromService().saveData(tmodel.Mestype, takeData))
37 message = queue.ReceiveById(messageEnum.Current.Id); //刪除
38 }
39 }
40 }
41 Thread.Sleep(1000);
42 }
43 }
44 #endregion
45
46
接收端使用一個單獨的線程來監測訊息,而訊息的讀取本身具有阻塞,所以在沒有新訊息時此線程處於停止狀態,在有新的訊息時才運行,運行完成後再次阻塞。發送端與接收端共用了一個資料類,內容可根據自己的需要進行定義。