C#套接字性能.Net 4.5 Async vs [...] Async vs Begin [...]

Gus*_*cco 6 c# sockets performance asynchronous

目前,根据我的研究,有三种方法可以异步使用套接字:

.Net 4.5异步示例:使用.Net 4.5异步功能进行套接字编程(第二篇文章)

[...] Async:http://msdn.microsoft.com/en-us/library/system.net.sockets.socketasynceventargs.aspx

开始[...]:http://msdn.microsoft.com/en-us/library/5w7b7x5f(v = vs.110).aspx

我对所有选项非常困惑.Net提供了使用异步套接字的方法.我为什么要使用其中一个?有数千个同时连接的性能有什么更好的选择?

Cor*_*son 9

使用SocketAsyncEventArgs最接近的方法与基础Windows技术(I/O完成端口)匹配.它们本质上是一个裸机包装器,旨在执行零分配并以不太友好的API为代价提取最高性能.这具有更紧密耦合的代码的缺点,因为它没有实现任何标准StreamAPI.其他异步套接字方法都包装了这个.

使用Begin/ Endpair的方法使用所谓的异步编程模型(APM).APM是.NET的原始异步模型.如果你使用半翘曲的话,很容易写出意大利面条代码,但是一旦你有了一些经验,它就会起作用并且相当简单.但是,它们不应该在现代.NET中看到太多用处,因为我们有更容易和更好的表现:

返回a的方法Task是使用基于任务的异步模式(TAP).任务是对APM的纯粹升级:它们更灵活,更易于编写,并且通常应具有相同或更好的性能.与语言集成async/ 结合使用时await,您可以编写性能优异且易于理解和维护的代码.

tl; dr使用Task方法,除非你有极端性能的要求.然后使用SocketAsyncEventArgs方法.不要使用APM方法.


nos*_*tio 5

有数千个同时连接的性能有什么更好的选择?
......
关于Begin [...]的好奇心.如果我有一个MMORPG服务器,其中一个连接相互交互位置更新,动画,效果(基本MMORPG机制),数字,这将是"负载很重的服务器"?200~300个同时连接?

在服务器端,您可以从使用任何异步套接字API(初始/结束式APM,基于事件的EAPTask基于TAP的API)中获益良多.这是因为与使用同步API相比,您将阻止更少的线程.因此,可以使用更多线程同时为服务器提供其他传入请求,从而提高其可伸缩性.

最有可能的是,您不会看到使用TAP套接字API而不是其APM或EAP类似物的任何性能优势.但是,与APM或EAP相比,TAP API模式更容易开发.与其一起使用时async/await,它会产生更短,更易读且更不容易出错的代码.您将获得自然的伪线性代码流,这是APM回调或EAP事件处理程序无法实现的.如果无法找到合适的Task基于套接字API,你总是可以自己做一个Begin/EndAPM API和Task.FromAsync(或从EAP API,检查"可重复使用的模式将事件转化为任务").

对于客户端UI应用程序,可伸缩性并不重要,但TAP模式还有另一个好处.通过很少的努力,它有助于使您的UI响应,因为您不会阻止UI线程(通常在等待同步调用的结果时发生).这不是特定于Task基于Socket的API,它适用于任何Task基于API的API,例如,Task.Delay()Stream.ReadAsync().

有关C#中异步编程的一些好的阅读材料,请查看async/await标签wiki:

https://stackoverflow.com/tags/async-await/info