मुझे नहीं लगता कि पैटर्न आप अपेक्षा करते हैं। क्या आप घटना को मौजूदा ऑब्जेक्ट का संदर्भ रखने से रोकने की कोशिश कर रहे हैं ताकि मेमोरी लीक को रोका जा सके? ProcessEvent
का मूल्यांकन करने के लिए लैम्ब्डा अभिव्यक्ति this
के मान को कैप्चर करेगी (माना जाता है कि ProcessEvent
एक उदाहरण विधि है), इसलिए आपको अभी भी रिसाव होगा। यह कोड SomeEvent += (sender, e) => ProcessEvent();
करने जैसा ही है।
तुम कुछ इस तरह अधिक करने के लिए (जो भी आप क्या चाहते हैं नहीं है) की कोशिश कर रहा हो सकता है: तो तुम एक मजबूत संदर्भ की जरूरत नहीं होगी,
var reference = new WeakReference((Action)ProcessEvent);
SomeEvent += (sender, e) => ((Action)reference.Target)();
अब लैम्ब्डा अभिव्यक्ति WeakReference कब्जा this
पर। दुर्भाग्यवश, प्रोसेसएवेंट से बनाए गए प्रतिनिधि का संदर्भ कुछ और नहीं है, इसलिए अगली जीसी पर इसे हटा दिया जाएगा भले ही this
अभी भी जिंदा है। (यह लक्ष्य शून्य के लिए भी जांच नहीं करता है)।
आप कुछ इस तरह की कोशिश कर सकते: इस तरह इसका इस्तेमाल
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 के रिसीवर के लिए एक कमजोर संदर्भ रखेंगे, और स्वचालित रूप ईवेंट निकल जाएगा ईवेंट को इकट्ठा करने के बाद से हैंडलर, जो घटना को नियमित रूप से उठाए जाने तक स्मृति रिसाव को रोकना चाहिए।
क्या आपने मेरा प्रश्न/उत्तर [यहां] देखा था (http://stackoverflow.com/questions/1747235/weak-event-handler-model-for-use-with-lambdas)? यह एक लाइनर नहीं है, लेकिन मुझे लगता है * यह काम करता है ... – Benjol