使用async/await模式在C#5中编写高度可伸缩的TCP/IP服务器?

Ben*_*esh 25 .net c# sockets async-await

我的任务是设计一个相当简单的TCP/IP服务器,它必须接受来自多个客户端的连接.它需要用C#编写,我使用的是.NET 4.5.也就是说,我不确定.NET 4.5中TCP/IP服务器/客户端可扩展性的当前"最先进"是什么.

我确实看到了这篇文章:如何编写可扩展的基于Tcp/Ip的服务器.但这与.NET 2.0和3.5有关,并没有提到async/await模式.

我能够以"旧方式"编写服务器...但我想知道"新方式"是什么.

  • 在Socket,TcpClient或TcpListener上使用新的Async方法在C#中创建可伸缩服务器的最佳方法是什么?
  • 新的Async方法是否利用I/O完成端口?
  • 滚动自己的Socket监听器是否更有效,或者TcpListener/TcpClient类现在相当不错?

编辑:其他问题.

Ste*_*ary 11

在Socket,TcpClient或TcpListener上使用新的Async方法在C#中创建可伸缩服务器的最佳方法是什么?

没有任何新的async方法Socket; 名为*Asyncon 的方法Socket是一组特殊的API,用于减少内存使用量.TcpClientTcpListener确实得到了一些新的async方法.

如果你想要最好的可扩展性,你可能最好使用Stephen Toub的定制等待者Socket.如果你想要最简单的代码,你可能最好使用TcpClientTcpListener.

新的Async方法是否利用I/O完成端口?

是的,就像BCL中的大多数其他异步API一样.AFAIK,Stream该类是唯一可能不使用IOCP的类; 所有其他*Begin/ *End/ *Async方法都使用IOCP.

滚动自己的Socket监听器是否更有效,或者TcpListener/TcpClient类现在相当不错?

这些课程非常好.Stephen Toub有一篇博文,在内存使用方面更有效率.

  • @blesh:不; 这是因为它使用`Socket``*Async`方法.通常,异步操作需要为每个操作分配一个结构(`IAsyncResult`,类似于'OVERLAPPED`).`Socket``*Async`方法使用`SocketAsyncEventArgs`,它有点像可重用的`IAsyncResult`.因此,分配/解除分配较少,对GC的压力较小. (3认同)