【问题标题】:When to use the WeakReference in C# (if not for caching)? [duplicate]何时在 C# 中使用 Wea​​kReference(如果不用于缓存)? [复制]
【发布时间】:2012-10-08 06:04:59
【问题描述】:

可能重复:
Weak references

这东西是干什么用的?

这似乎是一种创建 GC 可以提早收集的对象的方法,如果提早收集,我应该重新创建它。这听起来像是缓存,但其他 StackOverflow questions say that this is a lousy cache strategy because the GC in practice will GC your object very eager and fast、(another Q that says weakreference make poor caches) 有点像使用 ASP.NET 的缓存并将其设置为非常低的缓存驱逐时间限制。

背景:我最近在阅读 TraceSource 的 CLR 代码。在构造函数中,发生的第一件事是将 WeakReference(this) 添加到静态字典中。奇怪的是,只有当 TraceSource 重新读取弱引用字典中每个 TraceSource 的配置文件时,它才会在 Refresh 方法中使用,但前提是它还没有被 GC 处理。还有一个StackOverflow question indicates this causes memory leaks

所以从那以后我一直在阅读有关 WeakReferences 的文章,并且越来越困惑。

【问题讨论】:

标签: c# weak-references


【解决方案1】:

缓存就是一个很好的例子。如果您在缓存中使用弱引用,则可以对未请求的项目进行垃圾收集以回收内存。

简而言之:任何可以方便检索的东西,但如果你不这样做并不重要。

【讨论】:

    【解决方案2】:

    WeakReference 通常用于实现Weak Events。事件处理程序是内存泄漏的常见原因,尤其是当您拥有一个包含多个实例订阅的事件的长期服务时。如果这些实例未能取消注册其事件处理程序(或者是因为开发人员没有意识到它的重要性,或者通常是由于异常情况没有触发正常清理),那么延迟引用会阻止这些实例被收集。

    另一个很好的情况是,如果您想将其他数据与现有实例相关联。例如,您可能有一个 ExtraWidgetInfo,您希望将其与第 3 方 Widget 关联。创建关联的一种方法是使用字典。问题是现在所有的小部件都由字典本身保持活动状态,即使它们不再在其他任何地方使用。为 Widget 引用使用 Wea​​kReference 可以防止相关数据在 Widget 过期后保持活动状态。

    【讨论】:

      【解决方案3】:

      当然不适合缓存,因为 GC 会在运行时清理所有当前未引用的缓存项。它不会等待内存压力或其他东西。它不允许缓存增长。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-11-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-05-20
        • 1970-01-01
        相关资源
        最近更新 更多