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