使用异步/等待模式在C#5中编写高度可扩展的TCP/IP服务器?

使用异步/等待模式在C#5中编写高度可扩展的TCP/IP服务器?,c#,.net,sockets,async-await,C#,.net,Sockets,Async Await,我的任务是设计一个相当简单的TCP/IP服务器,它必须接受来自多个客户端的连接。它需要用C#编写,我使用的是.NET4.5。也就是说,我不确定.NET4.5中TCP/IP服务器/客户端可伸缩性的当前“最先进水平”是什么 我确实看到了这个帖子:。但这与.NET2.0和3.5有关,没有提到异步/等待模式 我有能力写一个服务器的“老办法”。。。但我想知道“新方式”是什么 在Socket、TcpClient或TcpListener上使用新的异步方法在C#中创建可伸缩服务器的最佳方法是什么 新的异步方法

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

我确实看到了这个帖子:。但这与.NET2.0和3.5有关,没有提到异步/等待模式

我有能力写一个服务器的“老办法”。。。但我想知道“新方式”是什么

  • 在Socket、TcpClient或TcpListener上使用新的异步方法在C#中创建可伸缩服务器的最佳方法是什么
  • 新的异步方法是否利用I/O完成端口
  • 滚动您自己的套接字侦听器是否更有效,或者TcpListener/TcpClient类现在是否相当好
编辑:其他问题

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

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

如果您想获得最佳的可伸缩性,那么最好使用。如果您想要最简单的代码,那么最好使用
TcpClient
TcpListener

新的异步方法是否利用I/O完成端口

是的,就像BCL中的大多数其他异步API一样。总之,
类是唯一可能不使用IOCP的类;所有其他
*开始
/
*结束
/
*异步
方法都使用IOCP

滚动您自己的套接字侦听器是否更有效,或者TcpListener/TcpClient类现在是否相当好


这些课程都很好。Stephen Toub有一个在内存使用方面更高效的方法。

对于.net4.5,您可以使用async/await关键字来构建tcp服务器。 下面是示例代码。

它可以接受超过10K的连接。

没有C#4.5:)它是.net 4.5,C#5这可能很有用-@SoroushFalahati:Async使用I/O完成端口不应该阻塞线程。事实上,.NET 3.5和更高版本中的大多数Begin/AsyncResult类型I/O方法都利用IOCP,因此它们不应该像.NET 2.0中的async那样阻止任何线程。@SoroushFalahati:事实上,我很确定绝大多数浏览器和web服务器都使用异步方法。特别是基于IOCP。您是否考虑过使用networkcomms.net之类的网络库?这里有一个很好的例子说明了它的作用,与以下问题无关:什么是IO完成端口?对不起,VB的背景使我没有遇到这个问题。谢谢。@StaurtDunkeld链接了上面的那篇文章。我仔细查看了一下,我想我没有注意到这是一个试图创建更高效的侦听器/客户机的尝试。我试图理解是什么让它更高效地存储。您是否不需要实例化一个TcpClient并将其保留以管理连接?@shahkalpesh:。NET当前每个应用程序域使用一个IOCP,绑定到线程池。@blesh:否;这是因为它使用了
Socket
*Async
方法。通常,异步操作需要为每个操作分配一个结构(
IAsyncResult
,类似于
OVERLAPPED
)。
Socket
*Async
方法使用
SocketAsyncEventArgs
,这有点像可重用的
IAsyncResult
。因此,分配/解除分配更少,GC的压力更小。谢谢您的回答。我想我要做的是使用TcpListener/TcpClient并将它们抽象出来,这样如果我以后需要使用Toub的方法进行优化,我就可以了。