在潜在线程密集应用中的几个插座的异步与同步套接字

时间:2012-07-25 20:45:01

标签: multithreading sockets thread-safety threadpool compact-framework2.0

我正在为Windows CE设备在Compact Framework 2.0上为我的公司编写一个相对较大的应用程序,而且我正在使用单个CPU内核。

在没有深入细节的情况下,非套接字相关的工作在最坏的情况下可以同时运行10个左右的线程。

考虑到这一点,我第一次使用套接字而不是一个小的测试应用程序。这个更大的应用程序可能会在同一个IP地址上与7个不同的端口进行通信(例如显然是错误的IP,1.2.3.4:4000,1.2.3.4:2004,1.2.3.4:4002等),因此使用7个不同的套接字对象。

Compact Framework 2,1个CPU核心,在最坏的情况下大约10个非套接字线程,7个套接字用于编程发送功能和连续接收(处理/响应ASAP)所有它们。

我一直在考虑异步套接字编程是否只会让我遇到麻烦,Compact Framework 2.0的默认最大线程数为25(每个核心),以及我必须获得的“聪明”。

你有什么建议?异步或同步套接字编程,以及您建议的任何特定的其他详细信息,或者如果我不担心任何内容。

2 个答案:

答案 0 :(得分:1)

我总是建议在同步套接字上使用异步套接字。根据底层子系统,异步套接字可能不使用任何其他线程。大多数情况下,使用同步套接字需要手动创建线程以避免阻止UI(如果有的话)。

让别人管理异步比管理你自己的线程容易得多。

无论异步套接字做什么都不会影响.NET线程池

答案 1 :(得分:1)

由于您的设备肯定具有有限的内存,并且因为.NET线程堆栈默认消耗1MB内存(已提交,而不仅仅是保留),我认为您应该使用异步IO,因为它不会阻止线程。只有你的回调/延续发布在线程池上。线程池线程很少,因此堆栈的内存使用率较低。

请记住,异步IO主要是关于不阻塞线程,从而节省内存和操作系统句柄。它不是降低CPU成本(根据我对网络IO的基准测试,情况正好相反)。