2013-04-01 54 views
1

我看MSDN SocketAsyncEventArgs的例子,並不能完全確定在100個無限寫入我們客戶端的情況下將創建多少個線程?MSDN SocketAsyncEventArgs exapmle:創建了多少個線程?

或者更好,如果我們可以將ProcessReceive成某種形式的通信協議,討論到客戶端和回讀無限將我們所有的ProcessReceive在100級獨立運行的線程或將是有幾分相像Unity3d程序在一個線程?

我很感興趣,因爲在那個例子中沒有看到任何直接線程相關的代碼,除了Semaphore

回答

2

對此的答案是「它取決於」。 SendAsync,AcceptAsyncReceiveAsync使用異步IO和完成端口。這是通過用於IO線程的獨立線程池完成的。這與「其他」線程池的操作類似 - 它具有最小值和最大值。 IO線程池的默認最大值爲1000 [1]因此可以想象,該示例可能高達100個線程。

線程池根據需要在等待狀態下創建線程,並且隨着異步IO完成,這些線程將從等待狀態中移出以處理結果。

但是,實際上它取決於何時發送數據包和何時接收數據包。可以想象,如果對所有發送的所有響應都按順序發生,則它可能低至1個線程。但是,這可能非常罕見。實際上,您可以真正估計的最接近1到100個線程(包括1和100個線程)。

您可以通過跟蹤每個異步操作的Thread.CurrentThread.ManagedThreadId進行測試。

要記住的重要一點是Completed事件是在線程池線程上產生的,應該採取常規的線程安全預防措施(例如使用Semaphore)。

[1]喬·達菲,在Windows,2008年,Addison-Wesley出版社專業

並行編程