使用async / await模式在C#5中编写高度可伸缩的TCP / IP服务器?
我的任务是设计一个相当简单的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类现在相当不错?
编辑:其他问题。
在Socket,TcpClient或TcpListener上使用新的Async方法在C#中创建可伸缩服务器的最佳方法是什么?
Socket
上没有任何新的async
方法; Socket
上名为*Async
的方法是一组特殊的API,用于减少内存使用量。 TcpClient
和TcpListener
确实获得了一些新的async
方法。
如果你想要最好的可扩展性,你可能最好使用Stephen Toub为Socket
定制的等待者 。 如果您想要最简单的代码,那么最好使用TcpClient
和TcpListener
。
新的Async方法是否利用I / O完成端口?
是的,就像BCL中的大多数其他异步API一样。 AFAIK, Stream
类是唯一可能不使用IOCP的类; 所有其他*Begin
/ *End
/ *Async
方法使用IOCP。
滚动自己的Socket监听器是否更有效,或者TcpListener / TcpClient类现在相当不错?
这些课程非常好。 Stephen Toub有一篇博文 ,在内存使用方面更有效率。
使用.net4.5,您可以使用async / await关键字来构建tcp服务器。 这是示例代码。 异步等待tcp服务器
它可以接受超过10K的连接。