.NET Framework 2.0SP1及以后版本提供了一組用於網絡通信的增強功能類庫,SocketAsyncEventArgs 就是其中最重要的一個,下面是MSDN對這組增強功能的類庫的介紹。
System.Net.Sockets.Socket 類有一組增強功能,提供可供專用的高性能套接字應用程序使用的可選異步模式,SocketAsyncEventArgs 類就是這一組增強功能的一部分。該類專為需要高性能的網絡服務器應用程序而設計。應用程序可以完全使用增強的異步模式,也可以僅僅在目標熱點區域(例如,在接收大量數據時)使用此模式。
這些增強功能的主要特點是可以避免在異步套接字 I/O 量非常大時發生重復的對象分配和同步。當前由 System.Net.Sockets.Socket 類實現的開始/結束設計模式要求為每個異步套接字操作分配一個 System.IAsyncResult 對象。
在新的 System.Net.Sockets.Socket 類增強功能中,異步套接字操作由分配的可重用 SocketAsyncEventArgs 對象描述並由應用程序維護。高性能套接字應用程序非常清楚地知道必須保持的重疊的套接字操作的量。應用程序可以根據需要創建任意多的 SocketAsyncEventArgs 對象。例如,如果服務器應用程序需要總是有 15 個未完成的套接字接收操作來支持傳入客戶端連接率,那么可以為此分配 15 個可重用的 SocketAsyncEventArgs 對象。
使用此類執行異步套接字操作的模式包含以下步驟:
- 1. 分配一個新的 SocketAsyncEventArgs 上下文對象,或者從應用程序池中獲取一個空閑的此類對象。
- 2. 將該上下文對象的屬性設置為要執行的操作(例如,完成回調方法、數據緩沖區、緩沖區偏移量以及要傳輸的最大數據量)。
- 3. 調用適當的套接字方法 (xxxAsync) 以啟動異步操作。
- 4. 如果異步套接字方法 (xxxAsync) 返回 true,則在回調中查詢上下文屬性來獲取完成狀態。
- 5. 如果異步套接字方法 (xxxAsync) 返回 false,則說明操作是同步完成的。可以查詢上下文屬性來獲取操作結果。
- 6. 將該上下文重用於另一個操作,將它放回到應用程序池中,或者將它丟棄。
新的異步套接字操作上下文對象的生命周期由應用程序代碼引用和異步 I/O 引用決定。在對異步套接字操作上下文對象的引用作為一個參數提交給某個異步套接字操作方法之后,應用程序不必保留該引用。它將在完成回調返回之前一直保持引用。但是,應用程序保留對上下文的引用是有好處的,這樣該引用就可以重用於將來的異步套接字操作。
MSDN 也提供了一個簡單的使用 SocketAsyncEventArgs 的TCP 通信示例,從示例可以了解 SocketAsyncEventArgs 使用的基本方法。本系列文章將介紹如何使用 SocketAsyncEventArgs 進行 UDP 通信,最終將實現一個類似與 UdpClient 類功能的 UdpSocket 組件,本系列文章初步分文以下幾部分:
2、 UdpSocket 緩沖區 BufferManager 介紹
3、 UdpSocket 的 SocketAsyncEventArgs 緩存池的實現
4、 UdpSocket 實現介紹
目的是通過上面幾部分的介紹,學習:
1、 當需要申請大量的內存空間的時候,如何設計和使用緩沖區。
2、 當需要不停的實例化和銷毀一個對象,如何設計和使用緩存池(WeakReference的使用)。
3、 了解 SocketAsyncEventArgs 的使用。