2011-10-12 56 views
2

我有一個使用WeakReferences存儲Action<T>的事件聚合器。我遇到的問題是我的行爲不斷收集垃圾。什麼時候動作<T>得到垃圾回收?

下會失敗......

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變量幫助保持東西還活着,但我有點困惑至於爲什麼..更重要的是,有沒有一種方法可以保持行動沒有參考?

+0

你爲什麼在這裏使用WeakReferences?他們假設你對其他地方的特定項目有非弱的參考... – Joe

+1

因爲我不想要事件彙總。永遠保持周圍事物。我的問題更多..如果Foo沒有被GC'ed ..爲什麼行動被GC'ed?它只是在創造它的方法的生命中才存在嗎? –

回答

0

何時Action收到垃圾回收?

當垃圾收集器感覺像。

WeakReference類因此descibed:

表示弱引用,該引用對象,同時仍然允許該對象被垃圾收集被回收。

換句話說,你明確地說過你不介意對象是否被收集。你不能讓你的蛋糕吃掉它。要麼採取強有力的參考,要麼準備在物品被收集的情況下重新創建物體。

+0

我當時很希望動作可以與創建它的實際類綁定,但事後看來並沒有多大意義。 –

0

我不認爲你會得到一個有效的「答案」,因爲你正在處理垃圾收集器碰巧在您的計算機上運行的無證內部,因爲它正好現在被配置。

改變垃圾收集器的:

和你可以期待不同的行爲。


這使我回答你的問題:我不知道。