我不認爲這種模式符合你的期望。你是否試圖阻止事件持有對當前對象的引用,以防止內存泄漏? lambda表達式將捕獲this
的值以便評估ProcessEvent
(假設ProcessEvent
是一個實例方法),所以您仍然有泄漏。此代碼與SomeEvent += (sender, e) => ProcessEvent();
相同。
你可能會試圖做一些更多這樣的(這也不是你想要的):
var reference = new WeakReference((Action)ProcessEvent);
SomeEvent += (sender, e) => ((Action)reference.Target)();
現在lambda表達式將捕獲的WeakReference,所以你不會有很強的借鑑意義到this
。不幸的是,沒有別的東西引用從ProcessEvent創建的委託,所以即使this
仍然存在,它也會在下一個GC中刪除。 (這也不檢查目標爲空)。
你可以嘗試這樣的事:
public EventHandler MakeWeakHandler(Action action, Action<EventHandler> remove)
{
var reference = new WeakReference(action.Target);
var method = action.Method;
EventHandler handler = null;
handler = delegate(object sender, EventArgs e)
{
var target = reference.Target;
if (target != null)
{
method.Invoke(target, null);
}
else
{
remove(handler);
}
};
return handler;
}
,然後用它是這樣的:
SomeEvent += MakeWeakHandler(ProcessEvent, h => SomeEvent -= h);
這將保持一個弱引用的processEvent的接收器,並會自動刪除事件事件處理程序在收集完成之後,只要定期提升事件就應該防止內存泄漏。
您是否看到我的問題/答案[here](http://stackoverflow.com/questions/1747235/weak-event-handler-model-for-use-with-lambdas)?這不是一句話,但我*認爲*它的工作原理... – Benjol 2011-09-22 09:57:33