P2PMessageQueue的外部特征與設(shè)計(jì)理念
P2PMessageQueue
確定 P2PMessageQueue 的公共接口的最佳方式是使用類。IntelliSense 將顯示每個(gè)方法和每個(gè)參數(shù)的描述性幫助信息。以下幾個(gè)段落將概述 P2PMessageQueue 接口。
圖 1 顯示該類的統(tǒng)一建模語(yǔ)言 (UML) 表示形式(以及它的兩個(gè)依賴項(xiàng):Message 類和 ReadWriteResult 枚舉)。
圖 1. 顯示以下三種類型的類關(guān)系圖: P2PmessageQueue 、 Message 和 ReadWriteResult 。
如果您偏愛(ài)描述性信息較少的 Object Browser 屏幕快照(但對(duì)于某些人來(lái)說(shuō)可能更為熟悉),請(qǐng)參見(jiàn)圖 2。
圖 2. 顯示這三種類型的 Visual Studio Object Browser 。
請(qǐng)注意尚未討論的項(xiàng)以及 UML 關(guān)系圖中未顯示的項(xiàng)。
添加了 DataOnQueueChanged 事件。正如您將看到的那樣,在沒(méi)有該事件的情況下,P2PMessageQueue 類仍然可用,但是當(dāng)只讀隊(duì)列非空并且只寫隊(duì)列未滿時(shí),該增強(qiáng)功能將通知客戶端。在內(nèi)部,將阻塞等待隊(duì)列句柄的線程,并在句柄收到信號(hào)時(shí)激發(fā)該事件,這就避免了錯(cuò)誤的發(fā)生。(請(qǐng)參見(jiàn)代碼以獲取詳細(xì)信息。)請(qǐng)注意,該事件不 在 UI 線程上,因此您需要使用 Control.Invoke。如果查看代碼,您還將看到在調(diào)用 Close 方法時(shí),該線程是如何完全關(guān)閉的,這正是 .NET Compact Framework 版本 1.0 的線程所需要的。.NET Compact Framework 版本 1.0 中的 Thread 類不提供 IsBackground 屬性或 Abort 方法;因此,必須確保應(yīng)用程序提供必需的代碼來(lái)完全終止該應(yīng)用程序啟動(dòng)的所有線程。如果不提供該代碼,則運(yùn)行應(yīng)用程序的進(jìn)程很可能無(wú)法終止,因?yàn)檫\(yùn)行中的 .NET Compact Framework 1.0 線程會(huì)保持該進(jìn)程運(yùn)行,即使主應(yīng)用程序線程嘗試退出也是如此。
此外,如果查看該實(shí)現(xiàn)會(huì)發(fā)現(xiàn)兩個(gè)受保護(hù)的虛擬方法。
- # void StartEventThread()
- # Int32 GetBehaviourFlag()
如果不需要啟動(dòng)事件線程,則可以用一個(gè)空方法重寫第一個(gè)方法。不啟動(dòng)事件線程是一個(gè)非常規(guī)方案(因?yàn)闊o(wú)法直接訂閱該事件),但是的確存在該選項(xiàng)。第二個(gè)方法返回傳入到 CreateMsgQueue 方法的標(biāo)志 (MSGQUEUOPTIONS.dwFlags) 中使用的整型參數(shù)。MSGQUEUE_ALLOW_BROKEN 的默認(rèn)設(shè)置很不錯(cuò),但是如果要更改它(例如,更改為 0 或 MSGQUEUE_NOPRECOMMIT),則重寫 GetBehaviorFlag 是最好的做法。
現(xiàn)在您應(yīng)該已經(jīng)十分了解 P2PMessageQueue類的外部特征,以及為什么以這種方式設(shè)計(jì)。
【編輯推薦】