【问题标题】:When does an Action<T> get garbage collected?Action<T> 什么时候被垃圾回收?
【发布时间】:2011-10-12 18:30:56
【问题描述】:

我有一个使用 Wea​​kReferences 存储 Action&lt;T&gt; 的事件聚合器。我遇到的问题是我的行为不断被垃圾收集。

以下将失败...

public Foo(IEventAggregator eventAggregator)
{
   eventAggregator.Subscribe<BarEvent>(DoNothing)
}

public void DoNothing(BarEvent aEvent) {}

但以下将成功...

private Action<BarEvent> _action;

public Foo(IEventAggregator eventAggregator)
{
  _action = DoNothing;
  eventAggregator.Subscribe<BarEvent>(_action);
}

public void DoNothing(BarEvent aEvent) {}

显然 _action 变量有助于保持活动,但我有点困惑为什么......更重要的是,有没有办法在没有参考的情况下保持动作?

【问题讨论】:

  • 你为什么在这里使用 Wea​​kReferences?他们有点假设您对其他地方的特定项目有非弱参考......
  • 因为我不想要 Event Aggr。永远保持周围的东西。我的问题更多.. 如果 Foo 没有被 GC'ed.. 为什么 Action 被 GC'ed?它是否只在创建它的方法的生命周期内存活?

标签: .net garbage-collection


【解决方案1】:

Action 什么时候被垃圾回收?

当垃圾收集器喜欢它时。

WeakReference 类是这样描述的:

表示弱引用,它在引用一个对象的同时仍然允许该对象被垃圾回收器回收。

换句话说,您明确表示您不介意对象是否被收集。你不能让你的蛋糕吃掉它。要么采用强引用,要么准备重新创建对象,以防它被收集。

【讨论】:

  • 我有点希望 Action 会与创建它的实际类相关联,但事后看来这没有多大意义。
【解决方案2】:

我不认为你会得到一个有效的“答案”,因为你正在处理垃圾收集器如何在你的计算机上运行的未记录的内部结构,因为它恰好是现在配置的。

改变垃圾收集器的:

你可以期待不同的行为。


这让我回答你的问题:我不知道。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-15
    • 2016-10-14
    • 1970-01-01
    相关资源
    最近更新 更多