使用异步/等待模式在C#5中编写高度可扩展的TCP/IP服务器?
我的任务是设计一个相当简单的TCP/IP服务器,它必须接受来自多个客户端的连接。它需要用C#编写,我使用的是.NET4.5。也就是说,我不确定.NET4.5中TCP/IP服务器/客户端可伸缩性的当前“最先进水平”是什么 我确实看到了这个帖子:。但这与.NET2.0和3.5有关,没有提到异步/等待模式 我有能力写一个服务器的“老办法”。。。但我想知道“新方式”是什么使用异步/等待模式在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#中创建可伸缩服务器的最佳方法是什么 新的异步方法
- 在Socket、TcpClient或TcpListener上使用新的异步方法在C#中创建可伸缩服务器的最佳方法是什么
- 新的异步方法是否利用I/O完成端口
- 滚动您自己的套接字侦听器是否更有效,或者TcpListener/TcpClient类现在是否相当好
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的方法进行优化,我就可以了。