在潜在的线程密集型应用程序中,几个套接字的异步套接字与同步套接字



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

在不详细说明的情况下,非套接字相关的工作在最坏的情况下可能有10个左右的线程同时运行。

考虑到这一点,我第一次在一个小的测试应用程序中使用套接字。这个较大的应用程序可能会与同一IP地址上的7个不同端口进行通信(例如,使用明显错误的IP,1.2.3.4:4000、1.2.3.4:4001、1.2.3.44:002等),从而使用7个不同的套接字对象。

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

我一直在考虑异步套接字编程是否只会给我带来麻烦,对于Compact Framework 2.0,默认的最大线程数为25(每个核心),以及我必须有多"聪明"。

你有什么建议?异步或同步套接字编程,以及您建议的任何特定的附加细节,或者如果我什么都不担心的话。

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

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

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

让其他东西管理异步比管理自己的线程容易得多。

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

相关内容

  • 没有找到相关文章

最新更新