2

我正在爲Windows CE設備在Compact Framework 2.0上爲我公司編寫一個相對較大的應用程序,並且正在使用單個CPU內核。針對多個套接字的異步與同步套接字在潛在線程密集型應用中的應用

沒有深入細節,在最壞的情況下,非套接字相關工作可以同時運行10個左右的線程。

記住這一點,我第一次在任何一個小測試應用程序中使用套接字。這個更大的應用程序可能會與同一IP地址上的7個不同端口通信(例如明顯錯誤的IP,1.2.3.4:4000,1.2.3.4:4001,1.2.3.4:4002等),因此使用7個不同的端口套接字對象。

精簡框架2,1 CPU芯,圍繞10個非插座線程在最壞的情況下,和圖7個插座編程發送的能力和連續接收(到處理/儘快響應)爲所有這些。

我一直在考慮,如果異步套接字編程只會讓我陷入困境,對於Compact Framework 2.0,線程的默認最大線程數是25(每個核心),並且基本上我得到的是多麼「聰明」。

您有哪些建議?異步或同步套接字編程,以及您建議的任何特定附加細節,或者如果我不擔心。

回答

1

當你的設備確實具有有限內存和.NET,因爲線程堆棧佔用1MB的內存在默認情況下(承諾,不只是保留),我想你應該使用異步IO,因爲它不會阻塞線程。只有您的回調/延續發佈在線程池中。線程池線程很少,因此堆棧的內存使用率較低。請記住,異步IO主要是關於不阻塞線程,從而節省內存和操作系統句柄。這不是關於降低CPU成本(根據我對網絡IO的基準測試,情況正好相反)。

+0

我擔心可能同時運行的線程的最大數量,但我沒有意識到只有回調(和從回調調用的函數)計入線程池中的線程,這是我需要的信息位。這聽起來像我所擔心的是保持回調短而簡潔,當然還有一般的線程安全。謝謝你的想法。 – 2012-07-26 13:29:23

+0

@PeterLacerenza,你完全正確。這是一個簡單的測試:將應用程序加載並暫停調試器。你應該看到沒有線程在某個地方暫停。如果是這種情況,你成功了,並且是非阻塞的。 – usr 2012-07-26 16:00:40

1

我總是推薦異步套接字通過同步套接字。根據基礎子系統的不同,異步套接字可能不會使用任何其他線程。大多數情況下,使用同步套接字需要手動創建線程以避免阻塞UI(如果有的話)。

讓別的東西管理異步比管理自己的線程容易得多。

無論異步插座做不會影響.NET線程池

+0

完全同意你最後的陳述。回調將每個線程使用一個線程,但每個線程的壽命都非常短暫,所以它本質上並不重要。感謝您的反饋。 – 2012-07-26 13:33:55

+0

我不清楚*什麼*「無所謂」。 – 2012-07-26 13:37:46

+0

簡單地說,如果一個線程(即回調方法)在處理所花費的時間上很短,那麼對線程池產生足夠的影響就不太可能導致問題或悲傷。 – 2012-07-26 17:30:00