आपको निश्चित रूप से संदर्भ को साफ़ करना होगा। यदि कोई संदेह था तो आप आसानी से अपने स्वयं के स्थिर घटना के साथ परीक्षण कर सकते हैं।
static class MemoryLeak
{
static List<Action<int>> list = new List<Action<int>>();
public static event Action<int> ActivateLeak
{
add
{
list.Add(value);
}
remove
{
list.Remove(value);
}
}
}
फिर निकालें फ़ंक्शन में ब्रेकपॉइंट सेट करके आप देख सकते हैं कि आपका संदर्भ साफ़ नहीं है।
class Program
{
static void Main(string[] args)
{
foo f = new foo();
MemoryLeak.ActivateLeak += o => f.bar();
f.tryCleanup();
}
}
class foo
{
public void bar()
{ }
public void tryCleanup()
{
MemoryLeak.ActivateLeak -= o => bar();
}
}
साइमन के समाधान के विकल्प के रूप में आप "अलग" क्रिया बनाने के लिए दूसरे बंदरगाह का उपयोग कर सकते हैं जिसे पारित किया जा सकता है।
foo f = new foo();
Action<int> callfoo = o => f.bar();
MemoryLeak.ActivateLeak += callfoo;
Action cleanUp =() => MemoryLeak.ActivateLeak -= callfoo;
// Now you can pass around the cleanUp action and call it when you need to unsubscribe from the event.
cleanUp();
मुझे यहां succint शैली पसंद है। मेरी जरूरतों के लिए, यह पूरी तरह से काम करना चाहिए। इसे लिखने के लिए समय निकालने के लिए धन्यवाद! – jschroedl