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 个不同的套接字对象。

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

我一直在考虑异步套接字编程是否只会给我带来麻烦,对于 Compact Framework 2.0,默认的最大线程数是 25(每个内核),本质上我必须得到多么“聪明”。

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

4

2 回答 2

1

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

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

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

于 2012-07-25T21:02:38.403 回答
1

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

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

于 2012-07-25T21:48:14.423 回答