首页 文章

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

提问于
浏览
23

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

我确实看到了这篇文章:How to write a scalable Tcp/Ip based server . 但这与.NET 2.0和3.5有关,并没有提到async / await模式 .

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

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

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

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

编辑:其他问题 .

2 回答

  • 10

    使用.net4.5,您可以使用async / await关键字来构建tcp服务器 . 这是示例代码 . async await tcp server

    它可以接受超过10K的连接 .
    tcp server

  • 0

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

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

    如果你想要最好的可扩展性,你可能最好使用Stephen Toub's custom awaiters for Socket . 如果您想要最简单的代码,那么最好使用 TcpClientTcpListener .

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

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

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

    这些课程非常好 . Stephen Toub有一个blog post,在内存使用方面更有效率 .

相关问题