C#begin*()方法vs服务器的threadpool

rye*_*guy 5 c# sockets networking

为了在C#中创建可扩展的多用户服务器,这两种类型的服务器中的哪一种更有效?你可以看到使用begin*方法异步服务器(如beginaccept,beginsend)的例子在这里,和线程池的实现在这里.

我知道什么是线程池以及它是如何工作的所以我非常了解该实现是如何工作的.那么异步服务器怎么样?这会为每个发送,接收和连接事件产生一个线程吗?与线程池相比效率如何?

效率我只是指速度和内存使用的总体平衡.

编辑:

有人建议我使用begin()方法,但是当它们产生一个新线程来处理发送,接收或连接事件时,它们是否会产生开销?或者他们最终使用某种内部线程池?如果没有,有没有办法让它使用线程池,或者我应该只是滚动我自己的异步套接字服务器?

Nic*_*unn 2

如果可扩展性意味着真正大量的连接,那么除了使用线程池之外,您还应该考虑许多其他方面。

1) 如果您使用.NET3.5,请考虑 SocketAsyncEventArgs 而不是 BeginXXX/EndXXX。MSDN 杂志中描述了该方法。这些允许更有效地调度和处理底层异步 I/O。

2)仔细考虑你的内存使用情况。为异步 I/O 分配的 Byte[] 缓冲区被固定,迫使 GC 在压缩阶段绕过它们,这反过来可能导致负载下出现碎片和 OutOfMemoryExceptions。此外,您还考虑了异步 I/O 的较低级别本机问题,例如非分页池中的可用内存。

一些可用的技术是对所有挂起的接收使用单个共享零字节缓冲区,并对实际传输数据的 I/O 使用池缓冲区(来自未压缩的内存 - LOH 或本机堆)。