यह .NET 4.0 के तहत संभव है और ConditionalWeakTable<TKey, TValue>
का उपयोग कर निम्नलिखित है। धन्यवाद this, और other साइट्स।
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Runtime.CompilerServices;
namespace Test
{
public static class GCInterceptor
{
private static ConditionalWeakTable<object, CallbackRef> _table;
static GCInterceptor()
{
_table = new ConditionalWeakTable<object, CallbackRef>();
}
public static void RegisterGCEvent(this object obj, Action<int> action)
{
CallbackRef callbackRef;
bool found = _table.TryGetValue(obj, out callbackRef);
if (found)
{
callbackRef.Collected += action;
return;
}
int hashCode = RuntimeHelpers.GetHashCode(obj);
callbackRef = new CallbackRef(hashCode);
callbackRef.Collected += action;
_table.Add(obj, callbackRef);
}
public static void DeregisterGCEvent(this object obj, Action<int> action)
{
CallbackRef callbackRef;
bool found = _table.TryGetValue(obj, out callbackRef);
if (!found)
throw new Exception("No events registered");
callbackRef.Collected -= action;
}
private class CallbackRef
{
private int _hashCode;
public event Action<int> Collected;
public CallbackRef(int hashCode)
{
_hashCode = hashCode;
}
~CallbackRef()
{
Action<int> handle = Collected;
if (handle != null)
handle(_hashCode);
}
}
}
}
निम्न कोड के साथ परीक्षण किया गया:
public partial class Form1 : Form
{
private object _obj;
public Form1()
{
InitializeComponent();
_obj = new object();
_obj.RegisterGCEvent(delegate(int hashCode)
{
MessageBox.Show("Object with hash code " + hashCode + " recently collected");
});
}
private void button1_Click(object sender, EventArgs e)
{
_obj = null;
GC.Collect();
}
}
मैं वहाँ जो इंगित करता है एक पते एकत्र की जा रही है किसी भी घटना को उठाया है पर विश्वास नहीं है यह अवधारणा कोड का सबूत इस प्रकार है। सबसे नज़दीकी चीज जो आप कोशिश कर सकते हैं वह संदर्भित प्रकार पर एक फाइनलाइज़र बना रहा है, हालांकि संग्रह होने से पहले एक अनिर्दिष्ट समय से पहले चलाया जाता है। मैं किसी को उत्तर देने के लिए समझदार हूं। –
कचरा कलेक्टर इसे नष्ट कर देता है अगर आपके ऑब्जेक्ट के विनाशक को बुलाया जाता है। आप विनाशक कॉल में प्रतिक्रिया दे सकते हैं और उदाहरण के लिए एक स्वयं बनाया घटना भेज सकते हैं। –
पुनरुत्थान के लिए एक नुस्खा की तरह लगता है। आप इसकी आवश्यकता क्यों है? – Ani