类的有效期的设计

FainSheeg 2019-12-07 09:38:16
现在要设计一个,这个类的的实例的存活有个有效期,到期之后就销毁,程序运行期间有可能会产生几万个实例,这是前提。
现在我有两种方案:
1.在构造函数里初始化一个timers.timer,到期后抛出一个事件,主程序订阅这个事件,在事件代码里销毁实例。
2.在类里加一个创建时间的属性createTime,开一个线程隔10秒轮询一次所有实例,把createTime跟当前时间对比。
请问,哪种更合理?最主要是想问,当实例达到几万个的时候,两种方案的开销差别大吗?主要是不了解timer的开销。
...全文
601 29 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
29 条回复
切换为时间正序
请发表友善的回复…
发表回复
FainSheeg 2019-12-11
  • 打赏
  • 举报
回复
引用 34 楼 秋的红果实 的回复:
[quote=引用 28 楼 FainSheeg 的回复:] [quote=引用 25 楼 秋的红果实 的回复:] 你的两种思路都不建议 你可以在创建一个新对象时,统计下当前已有的对象数目,要是达到你的上限(如1w),可以不创建新对象,或者销毁某些已有的对象
我设计有效期的目的并不是为了限制对象数量,而是过了有效期的对象从业务逻辑上来说已经是没用的了,放着浪费资源,所以开始想着到期后就销毁,后面几位大牛都建议用对象池来重用对象,避免重复创建实例的开销。这个建议确实可以大大的减少开销,不过并不是针对我的问题的,使用缓存类或者redis的建议才是解决了我的问题。感谢各位大牛。[/quote]所谓没用的对象,GC会自动回收。 [/quote] 业务逻辑上没用而已,代码逻辑上还存在着引用,也没有销毁。
FainSheeg 2019-12-10
  • 打赏
  • 举报
回复
引用 25 楼 秋的红果实 的回复:
你的两种思路都不建议 你可以在创建一个新对象时,统计下当前已有的对象数目,要是达到你的上限(如1w),可以不创建新对象,或者销毁某些已有的对象
我设计有效期的目的并不是为了限制对象数量,而是过了有效期的对象从业务逻辑上来说已经是没用的了,放着浪费资源,所以开始想着到期后就销毁,后面几位大牛都建议用对象池来重用对象,避免重复创建实例的开销。这个建议确实可以大大的减少开销,不过并不是针对我的问题的,使用缓存类或者redis的建议才是解决了我的问题。感谢各位大牛。
xiaoxiangqing 2019-12-10
  • 打赏
  • 举报
回复
Redis最方便
wanghui0380 2019-12-10
  • 打赏
  • 举报
回复
引用 25 楼 秋的红果实 的回复:
你的两种思路都不建议 你可以在创建一个新对象时,统计下当前已有的对象数目,要是达到你的上限(如1w),可以不创建新对象,或者销毁某些已有的对象
这个就是池
秋的红果实 2019-12-10
  • 打赏
  • 举报
回复
你的两种思路都不建议 你可以在创建一个新对象时,统计下当前已有的对象数目,要是达到你的上限(如1w),可以不创建新对象,或者销毁某些已有的对象
秋的红果实 2019-12-10
  • 打赏
  • 举报
回复
引用 28 楼 FainSheeg 的回复:
[quote=引用 25 楼 秋的红果实 的回复:] 你的两种思路都不建议 你可以在创建一个新对象时,统计下当前已有的对象数目,要是达到你的上限(如1w),可以不创建新对象,或者销毁某些已有的对象
我设计有效期的目的并不是为了限制对象数量,而是过了有效期的对象从业务逻辑上来说已经是没用的了,放着浪费资源,所以开始想着到期后就销毁,后面几位大牛都建议用对象池来重用对象,避免重复创建实例的开销。这个建议确实可以大大的减少开销,不过并不是针对我的问题的,使用缓存类或者redis的建议才是解决了我的问题。感谢各位大牛。[/quote]所谓没用的对象,GC会自动回收。
大番薯 2019-12-10
  • 打赏
  • 举报
回复
感谢各位大牛
正怒月神 2019-12-09
  • 打赏
  • 举报
回复
引用 14 楼 FainSheeg 的回复:
[quote=引用 11 楼 wanghui0380 的回复:] 程序运行一年,如果他正常无误不崩溃,不重启---------这程序一年会也许会new 一亿个对象 net会自己释放他,只要工作完了,没地方引用他了,他自然要被GC释放 也许你任务和你的描述没有关系,也许你要求只是,我6小时有一个几w的任务列表,我想在他工作完了回传通知一下从remove列表里删除,或者他超过一定时间了从remove列表删除 尤其后面一个微软本来就已经有了,那就是system.runtime.Cache, 他就是一个你要列表,而且你可以直接设定和时间关联的移除行为
非常感谢,学习到了 ,尤其是对象池,感觉对我来说又是一大进步,包括楼上几位提到的享元模式,虽然这里用不了,但也学习了。 Cache我去看了一下文档有几点疑问,文档说过期逐出缓存就是销毁的意思吗(不过按大佬的意思是还要重用的,应该不是销毁只是移出缓存吧)?如果过期是销毁的话是调用Dispose吗?
引用 13 楼 正怒月神 的回复:
其实,我觉得你简单一点。 直接通过cache创建,设置一个过期时间就好了。
看了一下MemoryCache的文档,几个添加缓存项的方法都是先创建实例再使用实例来创建缓存项的,版主说的通过Cache创建是这个意思 吗?[/quote] 就目前来说,如果你觉得cache不够强大,可以使用 redis。 memorycache的存储类型比较单一,不如redis
wanghui0380 2019-12-09
  • 打赏
  • 举报
回复
Cache我去看了一下文档有几点疑问,文档说过期逐出缓存就是销毁的意思吗(不过按大佬的意思是还要重用的,应该不是销毁只是移出缓存吧)?如果过期是销毁的话是调用Dispose吗? Gc销毁判定是无人引用他 Cache逐出缓存是指缓存里没有了,他被移出缓存,但GC此时需要综合判定,外面有没有人使用他,当然移除是有一个移除事件,你可以挂接一个消息,通知外面的所有的引用去移除他,让他不在被任何人使用,GC就会释放他 ps: 哪怕你的原始设计,调用Dispose,其实GC也未必就会释放他。GC自然释放的前提是“无人引用”他,他是“垃圾”了
FainSheeg 2019-12-09
  • 打赏
  • 举报
回复
引用 11 楼 wanghui0380 的回复:
程序运行一年,如果他正常无误不崩溃,不重启---------这程序一年会也许会new 一亿个对象 net会自己释放他,只要工作完了,没地方引用他了,他自然要被GC释放 也许你任务和你的描述没有关系,也许你要求只是,我6小时有一个几w的任务列表,我想在他工作完了回传通知一下从remove列表里删除,或者他超过一定时间了从remove列表删除 尤其后面一个微软本来就已经有了,那就是system.runtime.Cache, 他就是一个你要列表,而且你可以直接设定和时间关联的移除行为
非常感谢,学习到了 ,尤其是对象池,感觉对我来说又是一大进步,包括楼上几位提到的享元模式,虽然这里用不了,但也学习了。 Cache我去看了一下文档有几点疑问,文档说过期逐出缓存就是销毁的意思吗(不过按大佬的意思是还要重用的,应该不是销毁只是移出缓存吧)?如果过期是销毁的话是调用Dispose吗?
引用 13 楼 正怒月神 的回复:
其实,我觉得你简单一点。 直接通过cache创建,设置一个过期时间就好了。
看了一下MemoryCache的文档,几个添加缓存项的方法都是先创建实例再使用实例来创建缓存项的,版主说的通过Cache创建是这个意思 吗?
幽夜莫知途 2019-12-09
  • 打赏
  • 举报
回复
我顶。。。。。。。。。。。
正怒月神 2019-12-09
  • 打赏
  • 举报
回复
其实,我觉得你简单一点。 直接通过cache创建,设置一个过期时间就好了。
wanghui0380 2019-12-09
  • 打赏
  • 举报
回复
“缓存依赖”+“对象池” 这里缓存依赖------------system.runtime.Cache,楼上说的Redis也可以这么看 对象池------------这个是因为,虽然你6小时几w,但20分钟内也许就几k,无论是IO集中,还是cpu集中,我们总体上还是想控制一下,总体消耗,避免你在短时间内一次搞几w个超大cpu集中的任务出来,毕竟资源就那么多,一次突发集中,抢资源堵门,大家都别干了。(拍好队,一批一批过,别堵门口)
wanghui0380 2019-12-09
  • 打赏
  • 举报
回复
程序运行一年,如果他正常无误不崩溃,不重启---------这程序一年会也许会new 一亿个对象 net会自己释放他,只要工作完了,没地方引用他了,他自然要被GC释放 也许你任务和你的描述没有关系,也许你要求只是,我6小时有一个几w的任务列表,我想在他工作完了回传通知一下从remove列表里删除,或者他超过一定时间了从remove列表删除 尤其后面一个微软本来就已经有了,那就是system.runtime.Cache, 他就是一个你要列表,而且你可以直接设定和时间关联的移除行为
by_封爱 版主 2019-12-09
  • 打赏
  • 举报
回复
如果是我 我直接把这个"东西"扔到redis里...并且设置有效期. 读的时候 如果没读到 就证明过期了啊...
小白.C# 2019-12-09
  • 打赏
  • 举报
回复
看着大牛,我一个初学者路过。
wanghui0380 2019-12-09
  • 打赏
  • 举报
回复
无需纠结享元不享元,很多人回答的时候,不会分析你的潜台词 首先一个问题。 程序运行期间有可能会产生几万个实例---------------------运行期间-------------- 你说是“我的程序要运行7个小时,然后去处理几w个文件的下载,解压”他们就明白这玩意是不是享元了
FainSheeg 2019-12-09
  • 打赏
  • 举报
回复
引用 7 楼 圣殿骑士18 的回复:
所谓享元模式就是你把1和2结合一下
怎么个结合法?好几位同志都说用享元模式,特意去了解了一下,前提时对象要相同,可是我这所有对象都不会完全相同。
  • 打赏
  • 举报
回复
大神们讨论的好激烈。。。
正怒月神 2019-12-09
  • 打赏
  • 举报
回复
redis有发布订阅功能。 同时基于发布订阅功能,有过期通知的基类。
加载更多回复(9)

111,094

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧