.NET中的套接字类有一些新的异步方法(如Socket.ReceiveAsync
)。
我正在努力了解他们的目的。据我了解,创建它们是为了避免为每个操作创建一个新的IAsyncResult
对象。
假设我要创建一个高性能的HTTP服务器。然后我需要为每个操作创建一个Request或Response对象。而请求或响应对象肯定有一些属性,也可能是其他类(或只是基元+字符串)。我可能必须从数据库中获取信息(要创建更多对象)。
我的观点是每个请求/回复可以创建很多对象。 AsyncResult
对象是否太重以至于会影响整个服务器的性能?或者MS是否意味着我应该为服务器中的所有对象使用flyweight模式(重用请求/回复对象而不是分配新对象)?
请赐教。
从MSDN了解新的Async方法:
这些增强功能的主要功能是避免在高容量异步套接字I / O期间重复分配和同步对象。当前由System.Net.Sockets.Socket类实现的Begin / End设计模式需要为每个异步套接字操作分配System.IAsyncResult对象
来源:http://msdn.microsoft.com/en-us/library/system.net.sockets.socketasynceventargs.aspx
这个问题不重复。我不是在问这个区别。我很清楚这种差异。如果他们添加了减少分配和GC工作的方法,我应该在套接字处理之上的协议层中做同样的事情吗?即我应该对像HttpReqest
等对象使用flyweight模式。
答案 0 :(得分:2)
在一个套接字生存期内,每个开始/结束操作都将分配新的同步对象。
例如,您的逻辑是,
// GET /default.aspx HTTP/1.1<cr-lf>
ReadLine for Http Verb and Version
// Headers
ReadLine till you get empty line and process header
// Data
Read or process mime data
现在,如果您注意到,我们将永远不会在一个开始/结束调用中读取所有内容,而是每个操作将调用多个开始/结束,这将创建新的同步对象。
但这些步骤仅适用于一个客户端/服务器通信。
所以你的请求/响应对象在socket的整个生命周期中只有一个,在这种情况下你最好使用新的Async方法并留下你的请求/响应对象 只是一个单一的对象。
当服务器同时处理1000个请求时,这肯定会影响性能。即使同步对象占用100个字节但分配/重新分配,gc处理器的使用都将影响1000个同时操作。
但是,对于内存管理存在设计良好的算法,如果您的服务器将长时间连续运行,它肯定会导致碎片并且确实会减慢速度。
答案 1 :(得分:0)
不是您问题的直接答案,但有一些关于技术ed异步的好的演示文稿。您必须创建登录才能查看它们
DEV324 C# and Visual Basic Future: Async Made Simple 5月18日星期三
DEV335 Improving Your Microsoft ASP.NET Application Performance with Asynchronous Pages and Actions 5月19日星期四