|
1
1
您可以使用
将每个卷影集合添加到缓存中,可以使用大量的超时时间,也可以使用委托检查原始集合是否仍然存在(或者两者都存在)。 它不是 可怕地 与您自己的解决方案不同,但它确实使用经过尝试和信任的.NET组件。
除此之外,您将看到扩展ObservableCollection并使用这个新类(我认为这不是一个小的更改),或者更改/包装
对不起,我想不出别的了,但希望这有帮助。
|
|
|
2
1
如果替换ObservableCollection是可能的(例如,如果对所有集合实例使用公共工厂),则可以将ObservableCollection子类化,并添加一个Finalize方法,用于清除属于此集合的已删除项。 另一种选择是更改计算删除项目的方式。您可以保留原始的收集,并给客户一个简单的副本。当集合返回时,您可以比较这两个集合,以查看哪些项不再存在。如果对集合进行排序,则可以在线性时间内对集合的大小进行比较。如果不进行排序,则修改后的集合值可以放在哈希表中,该哈希表用于查找原始集合中的每个值。如果实体具有自然ID,那么将其用作键是确定返回集合中不存在哪些项(即已删除)的安全方法。这也在线性时间内运行。 否则,你最初的解决方案听起来也没那么糟糕。在Java中,弱引用可以注册在引用被清除时调用的回调。.NET中没有类似的功能,但是使用轮询是一种近似的方法。我不认为这种方法如此糟糕,如果它有效,那为什么要改变它呢? 顺便提一句,您不关心getHashCode()为不同的集合返回相同的值吗?使用对集合的弱引用作为键可能更合适,这样就不会发生冲突。 |
|
|
3
1
我认为你走的是一条很好的路,在这种情况下我会考虑重构。我的经验是,在99%的情况下,垃圾收集器使内存管理变得很棒——几乎不需要真正的工作。 但在1%的情况下,需要有人意识到,他们必须提高赌注,并通过在这些领域加强缓存/内存管理而进入“老派”。向你致敬,因为你意识到你正处于这种情况,并试图避免使用IDispose/Weakreference技巧。我想你真的会帮助下一个在你的代码中工作的人。 至于如何解决问题,我认为你对形势掌握得很好 -在需要创建对象时要清楚 -当你的物品需要销毁时要清楚。 -当需要将对象推送到服务器上时要清楚 祝你好运!告诉我们情况:) |