国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

P2PMessageQueue的實際用法

開發 后端
本文介紹如何使用P2PMessageQueue(點對點消息隊列)。您將看到使用 P2PMessageQueue 類和相關類型的示例。

使用 P2PMessageQueue

本部分,您將看到使用 P2PMessageQueue 類和相關類型的示例。

注 當運行該示例時,可以選擇部署到 Windows CE 或 Pocket PC 2003 模擬器或設備。您可以在不進行修改的情況下在任一個平臺上調試該項目(并運行該應用程序)。運行示例時,看到的第一個屏幕提示您在閱讀器進程和發送器進程間進行選擇。無論選擇哪一個,都必須再次運行 .exe 文件(從 Program Files),然后選擇另一個選項。在 Pocket PC 平臺上,無論是使用模擬器還是設備,都必須重命名 .exe 文件(否則將激活現有的運行中應用程序)。

字符串的簡單 IPC 交換

首先使用托管進程將字符串傳入另一個 .NET Compact Framework 應用程序(也可以使發送方或接收方成為本機應用程序。有三種不同的方法用來讀取接收端的字符串(相同的原理也適用于發送端):阻塞、非阻塞以及事件驅動。

發送方和接收方的圖形用戶界面 (GUI) 在功能方面是自描述性的,如圖 3、4 和 5 所示。

 主窗體

圖 3. 主窗體

讀取端 

圖 4. 讀取端

當發送方單擊 Send 按鈕時,發送一個字符串(如文本框中輸入的),并可以選擇將該消息設置為警告消息(基于 Message Is Alert 復選框狀態)。發送方會阻塞,直到針對指定超時發送該消息(作為 combobox 中選擇的發送方)。位于該復選框下面的窗體底部顯示 Send 方法的返回結果,如圖 5 所示(即 OK)。

 發送 / 編寫端

圖 5. 發送 / 編寫端

這里再次使用了下載示例中的 Send 方法。

  1. private void cmdSend_Click(object sender, System.EventArgs e) {  
  2. Message msg;  
  3.  
  4. msg = new Message(  
  5. System.Text.Encoding.ASCII.GetBytes(txtSend.Text),   
  6. chkIsAlert.Checked);  
  7.  
  8.     ReadWriteResult rwr = mQue.Send(msg, mTimeout);  
  9.     lblSendResult.Text = rwr.ToString();  
  10. }  
  11.  

當閱讀器收到一個消息后,會將它顯示在列表視圖(第三列)中,并指出它是否是警告消息(第二列)。當成功接收到該消息時,第一列將始終顯示 OK。默認情況下,要接收一個消息,請單擊 Receive 按鈕;如果沒有消息要接收或者方法失敗,則列表視圖的第一列將指出原因(另兩列在該情形中不適用)。

在讀取和發送時,Queue Info 菜單(單擊 Info,然后單擊 Queue Info)會顯示有關隊列的數據。接收端上的 Mode 菜單(單擊 Read,然后單擊 Mode)有三個菜單項:On Demand Only、Event driven 和 Block a Thread。這些項用于配置該程序如何接收隊列外的消息。當您選擇一個模式后,它在示例應用程序的生命周期內不應該更改(開發人員可針對自己的設計進行混合與匹配)。以下幾個小節描述三種讀取模式。

按命令讀(對應于菜單 On Demand Only )

當接收方單擊 Receive 按鈕時,將執行以下方法。

  1. private void cmdReceive_Click(object sender, System.EventArgs e) {  
  2.     Message msg;  
  3.     msg = new Message();  
  4.  
  5.     // mTimeout is set by the end user by means of the GUI   
  6.     // to DON'T BLOCK (0), BLOCK (-1), or a real timeout value  
  7.     ReadWriteResult rwr = mQue.Receive(ref msg, mTimeout);  
  8.  
  9.     ListViewItem lvi;  
  10. if (rwr == ReadWriteResult.OK){   
  11.     bool isAlrt;  
  12.         string payload;  
  13.         isAlrt = msg.IsAlert;  
  14.  
  15.         byte[] bytes = msg.MessageBytes;  
  16.         payload = System.Text.Encoding.ASCII.GetString(  
  17.                 bytes, 0, bytes.GetLength(0));  
  18.  
  19.         lvi = new ListViewItem(  
  20.                 new string[]{rwr.ToString(), isAlrt.ToString(), payload});  
  21. }else{        
  22.         lvi = new ListViewItem(  
  23.                 new string[]{rwr.ToString(), @"n\a", @"n\a"});  
  24.     }  
  25.         listView1.Items.Add(lvi);  
  26.         listView1.Columns[2].Width = -2;}  
  27.  

事件驅動

事件驅動模型基本上意味著應用程序不會在任意時刻通過調用 Receive(例如,在計時器上或者要求用戶單擊 Receive 按鈕)來輪詢新消息,相反,應用程序會訂閱并捕獲來自 P2PMessageQueue 類的事件。要訂閱事件,需要使用正規的 .NET Compact Framework 委托習語(隊列的創建也不例外)。

  1. mQue = new P2PMessageQueue(  
  2.     isReader, txtQueueName.Text, maxL, maxM, out firstTime);  
  3. mQue.DataOnQueueChanged += new EventHandler(mQue_DataOnQueueChanged);  

引發該事件會調用方法,在本例中,只調用現有的接收方法。

  1. private void mQue_DataOnQueueChanged(object sender, EventArgs e) {  
  2.     this.Invoke(new EventHandler(this.cmdReceive_Click));  
  3. }  

阻塞線程

第三種從隊列進行讀取的方法是:創建一個線程,并使其阻塞以等待隊列的 Receive 方法。每次接收到消息時,應用程序都會處理它,然后再次循環回阻塞。以下是一些帶有解釋的示例代碼。

您會在某個地方創建并啟動以下線程。

  1. Thread t = new Thread(new ThreadStart(ThreadBlockedOnRead));  
  2. t.Start();  

該線程用下面的方法運行。(有關更多上下文,請下載代碼)。

  1. private void ThreadBlockedOnRead(){  
  2.     while (mMode == 2){ // Thread mode  
  3.         Message msg = new Message();  
  4.  
  5.         //Can actually omit a timeout for a true infinite block   
  6.         ReadWriteResult rwr = mQue.Receive(msg, 60 * 1000);  
  7.         if (rwr == ReadWriteResult.InvalidHandle || mMode != 2){  
  8.             return;  
  9.         }  
  10.                   
  11.         string body = rwr.ToString();  
  12.         if (rwr == ReadWriteResult.OK){  
  13.             byte[] bytes = msg.MessageBytes;  
  14.             string bytesAsString =   
  15. System.Text.Encoding.ASCII.GetString(  
  16. bytes, 0, bytes.GetLength(0));  
  17.             body += " | " + msg.IsAlert.ToString() + " | " + bytesAsString;  
  18.         }  
  19.  
  20.         MessageBox.Show(body, "To terminate this mode use the menu again");  
  21.     }  
  22. }      
  23.  

基本示例代碼至此結束。讀取隊列的三種方式也可以應用于通過隊列發送。當事件接收到信號時(即,隊列從已滿轉變為未滿),可進行阻塞和發送或嘗試在不進行阻塞的情況下隨時進行發送。在下一部分中,您將看到該設計如何允許隊列中的消息包含其他結構 — 而不僅僅是字符串。

注 在開發一個依賴事件信號來識別隊列從已滿轉變為未滿的應用程序時,需要在應用程序啟動時針對隊列執行一個初始寫入操作。如果不執行該初始寫入操作,則應用程序永遠不會開始寫入,因為該初始寫入操作必須經過特定地執行才能填充轉變為未滿狀態的隊列,因此,向事件發出信號以觸發針對該隊列的進一步寫入操作。

發送和接收更復雜的類型(不僅僅是字符串)

在前幾部分中,是在應用程序之間傳遞字符串,但如果可以將字符串與字節數組進行轉換,則還可以傳遞任何數據類型。因此,將該類型轉換為一個字節數組,在其中創建 Message 類,然后發送 Message。在接收端,檢索 Message,獲取字節數組,然后在其中創建該類型(例如,公開類型的 ToBytes 和 FromBytes 方法)。另一個方法是,從 Message 類繼承自己的類,并在其中實現轉換。很自然,如果您嘗試傳遞一個復雜的對象圖,則在類型與字節數組之間進行轉換會難得多。嘗試使用沒有源代碼的類型需要特別注意,因為您可能不具有對該類型的完整狀態(例如,私有成員)的訪問權,因此,可能無法準確地在類型與字節數組之間進行轉換。

出于簡單的目的,假設將一個 Int64 和一個 Boolean 從一個進程傳遞到另一個進程。將創建一個 CustomMessage 類,如下所示。

  1. public class CustomMessage : Message {  
  2.     public long TotalMemory;  
  3.     public bool AfterGC;  
  4.     public CustomMessage(){  
  5.         TotalMemory = 0;  
  6.         AfterGC = false;  
  7.     }  
  8.     public CustomMessage(long totMem, bool afterGarbCol){  
  9.         TotalMemory = totMem;  
  10.         AfterGC = afterGarbCol;  
  11.     }  
  12.     public override byte[] MessageBytes {  
  13.         get {  
  14.             byte[] b1 = BitConverter.GetBytes(TotalMemory);  
  15.             byte[] b2 = BitConverter.GetBytes(AfterGC);  
  16.  
  17.             byte[] b = new byte[9];  
  18.             Buffer.BlockCopy(b1, 0, b, 0, 8);  
  19.             Buffer.BlockCopy(b2, 0, b, 8, 1);  
  20.             return b;  
  21.         }  
  22.         set {  
  23.             TotalMemory = BitConverter.ToInt64(value, 0);  
  24.             AfterGC = BitConverter.ToBoolean(value, 8);  
  25.             base.MessageBytes = value;  
  26.         }  
  27.     }  
  28. }  

添加了兩個感興趣的字段(TotalMemory、AfterGC),重寫 MessageBytes 屬性以實現轉換(get 和 set 方法位于轉換發生的位置),然后添加一個默認的構造函數(這個參數化的構造函數是可選的)。

現在,如果要使用前面的示例,只需更改兩處地方:

發送消息時,要創建一個 CustomMessage,而不是將值賦給 TotalMemory 和 AfterGC。

  1. //msg = new Message(. . .); //Instead of this line  
  2. msg = new CustomMessage(GC.GetTotalMemory(false), false);  
  3. ReadWriteResult rwr = mQue.Send(msg, mTimeout);  

接收消息時,要創建一個 CustomMessage。

  1. //msg = new Message();  
  2. msg = new CustomMessage(); //msg still declared as Message  
  3. ReadWriteResult rwr = mQue.Receive(msg, mTimeout);  

然后,在 mQue.Receive 返回時讀取它的屬性。

  1. //byte[] bytes = msg.MessageBytes;  
  2. //payload = System.Text.Encoding.ASCII.GetString(. . .);  
  3. payload = "Total Memory = " + ((CustomMessage)msg).TotalMemory.ToString() +   
  4.                     (((CustomMessage)msg).AfterGC ? " after a GC" : " without forcing a GC");  
  5.  

【編輯推薦】

  1. 點對點消息隊列函數:用于WinCE的IPC機制
  2. ASP.NET中無Cookie會話的優點與缺點
  3. 無Cookie會話的實現
  4. ASP.NET Cookie:不是問題的問題
  5. .NET框架中的XML:XmlSerializer的內部原理
責任編輯:yangsai 來源: MSDN
相關推薦

2009-08-06 16:27:05

P2PMessageQ

2010-04-28 14:56:02

Oracle sqlp

2010-05-31 14:16:01

MySQL數學函數

2010-05-04 12:10:08

Oracle over

2010-04-28 14:46:38

Oracle Copy

2010-04-28 16:30:52

Oracle case

2010-05-07 18:52:59

Oracle rown

2010-04-27 14:44:31

Oracle存儲過程

2010-05-05 15:38:31

Oracle安全策略

2010-04-29 13:31:16

Oracle Orad

2010-05-17 17:23:27

MySQL limit

2010-04-06 08:58:27

Oracle job

2010-05-26 16:53:21

MySQL show

2010-04-29 10:41:55

2012-01-06 10:59:37

Nuget

2010-04-29 13:53:42

Oracle臨時表

2010-06-30 13:07:17

SQL Server函

2012-12-10 09:46:21

P2P云存儲Symform

2011-04-25 13:36:26

iPad2攝像頭

2010-07-07 10:31:45

點贊
收藏

51CTO技術棧公眾號

一区二区三区毛片| 欧美精品久久久久久久免费观看| 影音先锋电影在线观看| 亚洲欧美一区二区在线观看| 91大神影片| 亚洲第一精品在线| 在线观看免费黄视频| 欧美不卡一二三| 黄瓜视频成人app免费| 日韩一级欧洲| 日本视频精品一区| 丁香婷婷综合激情五月色| 免费观看成人网| 亚洲高清不卡在线| 欧美性受ⅹ╳╳╳黑人a性爽| 一个人看的www久久| 婷婷综合成人| 欧美精品欧美精品系列c| 国产91在线看| 最近最新中文字幕在线| 精品久久久久久久久久久院品网 | 日韩网站免费观看高清| 同性恋视频一区| 国产偷久久久精品专区| 99这里只有精品| 巨骚激情综合| 精品国偷自产在线视频| 亚洲精品成人无限看| 日产精品久久久久久久蜜臀| 亚洲资源中文字幕| 亚洲涩涩在线| 国产精品欧美日韩| 九九精品视频在线看| 国产免费福利| 日韩精品极品在线观看| 精品色999| 一区二区三区偷拍| 亚洲高清不卡在线| 亚洲国产天堂| 国产日韩三区| 国产欧美综合色| 日韩精品分区| 欧美亚洲另类视频| 国产精品夜夜嗨| 国产精品一二三区视频| 九九热精品在线| 日本不卡中文字幕| 深夜福利视频在线观看| 国产麻豆精品久久一二三| 日韩美脚连裤袜丝袜在线| 日本精品福利视频| 电影在线高清| 欧美精品一区三区| 久久av一区| 91精品国产一区二区三密臀| 亚洲老头同性xxxxx| 亚洲字幕久久| 污网站在线观看免费| 亚洲天堂免费观看| 久久国产高清| 久久91亚洲精品中文字幕奶水| 欧美激情性爽国产精品17p| 日本黄色三级大片| 亚洲精品美女在线| 亚洲一区二区网站| 亚洲成人天堂| 热99在线视频| 久久综合色综合88| 国产美女高潮在线观看| 九九九九九九精品| 欧美日韩一区二区三区在线免费观看 | av小说在线| 日韩亚洲欧美成人| 视频一区在线| 中文精品视频一区二区在线观看| 欧美午夜精品久久久久久人妖| 久久久免费毛片| 黄色影院一级片| 国产视频在线观看一区二区| 亚洲欧洲一区| 国产高清在线| 91超碰在线电影| 一区二区三区在线观看国产| 欧美影院视频| 日韩手机在线观看视频| 国产一区二区三区在线观看网站| 久久精品官网| 欧美日韩一区二区三区在线| 精品欧美一区二区久久| 久久精品日韩| 91色中文字幕| 中文字幕视频一区二区在线有码| 欧美午夜a级限制福利片| 在线免费国产视频| 国产国语刺激对白av不卡| 国产欧美日韩不卡免费| 只有精品亚洲| 免费看国产曰批40分钟| 国产一区二区黄| 国产成人高清在线| 91精品产国品一二三产区| 在线观看日韩一区| 欧美美女在线| 亚洲精品第一国产综合野草社区| 91高潮精品免费porn| 亚洲日本在线视频观看| 秋霞在线一区| 在线国产视频| 国产成人一区二区三区免费看| 欧美日韩在线电影| 丝袜亚洲另类欧美| 中文在线аv在线| 人妻熟妇乱又伦精品视频| 欧美成人精品三级在线观看| 中文字幕免费不卡在线| 精品三级av| 飘雪影视在线观看免费观看 | av综合网站| 特黄特黄的视频| 成人精品一二区| 日韩欧美精品在线视频| 国产精品66部| 国产一区二区三区亚洲| 亚洲第一区视频| 亚洲国产欧美一区二区三区不卡| 亚洲视频在线观看视频| 国产视频一区二区在线| 成人黄色小视频| sm国产在线调教视频| 欧美成人精品免费| 欧美一级大片视频| 欧美色图在线观看| 国产激情视频一区二区在线观看| 欧州一区二区三区| 五月激情在线| aaa免费在线观看| 欧美黑人巨大精品一区二区| 亚洲无线码一区二区三区| 久久综合网络一区二区| **欧美日韩在线| 欧美色18zzzzxxxxx| 一级性生活视频| 国产精品视频26uuu| 亚洲精品在线三区| 国产精品白丝在线| 日韩高清在线电影| 久久porn| 黄在线免费观看| 欧在线一二三四区| 久久久久久99| 欧美极品在线播放| 91麻豆精品国产91久久久久久久久| 欧美二区观看| 天天天综合网| 欧美日韩国产亚洲一区| 999久久久久久久久6666| 9l视频自拍九色9l视频成人| av日韩亚洲| 香蕉网站在线| 免费一级大片| 亚洲综合av一区二区三区| 欧美3p在线观看| 国产曰批免费观看久久久| 国产精品一二三四五| 欧美大片在线看| 五月天久久比比资源色| 国产精品影视在线观看| 五月天激情综合网| 国产一区精品二区| www视频在线免费观看| 男人免费av| 成人免费毛片在线观看| 国产综合18久久久久久| 午夜精品久久久久久久白皮肤 | 蜜桃成人在线视频| 黄色大片在线免费看| 麻豆91av| 成人黄色免费片| 2021国产精品视频| 尤物yw午夜国产精品视频明星| 欧美伊人精品成人久久综合97| 中文字幕中文字幕中文字幕亚洲无线| 国产一区二区中文字幕| 亚洲网站啪啪| 青草国产精品| 欧美变态网站| 深夜福利一区二区三区| 忘忧草在线影院两性视频| 91伦理视频在线观看| 老司机色在线视频| 在线黄色免费观看| 女人和拘做爰正片视频| 中文字幕在线亚洲精品| 国内一区在线| 亚洲自拍欧美色图| 成人两性免费视频| 国产精品美女免费| 欧洲成人午夜免费大片| 欧美大片在线看| 欧美日韩成人精品|