首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >.NET池IAsyncResult对象

.NET池IAsyncResult对象
EN

Stack Overflow用户
提问于 2010-02-27 14:33:25
回答 2查看 757关注 0票数 0

通过阅读SendAsyncBeginAsync方法的Socket示例,我意识到有人建议汇集SocketAsyncEventArgs实例,因为每个调用都创建了一个IAsyncResult实例,因此它比BeginXX、EndXX异步方法更好。

我认为这并不是一个很好的实践,可以很容易地将可以实例化的对象(如SocketAsyncEventArgs)汇集在一起。对象分配非常快,并且对GC进行了优化,以有效地处理短活动对象。我试着实现一种池机制,看看它是如何执行的,实际上,在简单的对象上分配更快,这些对象除了将一些数据封装在ctor中之外什么也不做。(这就像通过发送数十亿条SELECT 1语句来分析DBMS,这就是我来这里的原因。)

我并不是问哪个更好,我相信分析实际应用程序会给出答案,但我只是好奇汇集简单的短活对象的好处。更好的GC性能?低内存碎片?在设计过程中值得考虑吗?

来自MSDN

这些增强的主要特性是避免在大容量异步套接字I/O期间重复分配和同步对象。System.Net.Sockets.Socket类当前实现的开始/结束设计模式要求为每个异步套接字操作分配一个System.IAsyncResult对象。 在新的System.Net.Sockets.Socket类增强中,异步套接字操作由应用程序分配和维护的可重用SocketAsyncEventArgs对象描述。高性能套接字应用程序最了解必须持续的重叠套接字操作的数量。应用程序可以创建它需要的许多SocketAsyncEventArgs对象。例如,如果服务器应用程序需要在任何时候都有15个套接字接受操作未完成以支持传入客户端连接速率,它可以为此目的分配15个可重用的SocketAsyncEventArgs对象。

谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-02-27 16:59:55

IAsyncResult接口包含一个类型为WaitHandleAsyncWaitHandle属性。WaitHandle消耗操作系统资源。

实际上,WaitHandle实现了IDisposable接口,所以实现IAsyncResult的类本身应该实现IDisposable

这一切都是说,躺在周围的数百个IAsyncResult实例不是内存问题,而是资源问题。新的套接字调用消除了对周围数百个IDisposable对象的需求。

票数 2
EN

Stack Overflow用户

发布于 2010-02-27 16:25:08

没有过期策略的缓存是内存泄漏。你的问题中没有任何东西表明你考虑过一个好的政策。如果没有缓存,那么就不要使用缓存。如果你这样做了,然后测试它,看看你是否能衡量实际的改进。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2347656

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档