【发布时间】:2015-04-21 13:52:06
【问题描述】:
在我的应用程序中,我有一个Dictionary<int, WeakReference<Foo>> 来缓存从文件中读取的Foos,其中键是文件中的索引。由于Foos 是可变的,只要在该索引处对Foo 的任何引用,缓存条目就必须保持活动状态(以便任何持有者以及从Foo 源中读取新内容的任何人都可以看到更改) .
一旦Foo 完全未引用,我想删除Dictionary 条目。我最初的想法是让 Foo 的终结器将自己从缓存中删除,但这会导致在缓存插入时触发 GC 时内部状态不一致。我试图牢记终结器不能用于托管内存的概念。那么有没有办法做到这一点呢?
【问题讨论】:
-
什么都不做怎么样,让 GC 和 WeakReference 做他们的事情?
-
GC 会清理字典中的
Foos,但不会清理KeyValuePair<int, WeakReference<Foo>>s。 -
我知道,但这只是很小的内存量。当您关闭文件/字典对时,所有这些都会被回收。
标签: .net caching garbage-collection weak-references finalizer