कभी-कभी उपयोगकर्ता टाइमर का एक बड़ा सेट शेड्यूल करना चाहते हैं और उन टाइमर के संदर्भों को प्रबंधित नहीं करना चाहते हैं।
यदि उपयोगकर्ता टाइमर का संदर्भ नहीं देता है, तो टाइमर को निष्पादित करने से पहले जीसी द्वारा एकत्र किया जा सकता है।
मैं कक्षा टाइमर बनाया नव निर्मित टाइमर के लिए एक जगह धारक के रूप में सेवा करने के लिए:टाइमर प्रतिनिधि के आसपास मेमोरी लीक
static class Timers
{
private static readonly ILog _logger = LogManager.GetLogger(typeof(Timers));
private static readonly ConcurrentDictionary<Object, Timer> _timers = new ConcurrentDictionary<Object, Timer>();
/// <summary>
/// Use this class in case you want someone to hold a reference to the timer.
/// Timer without someone referencing it will be collected by the GC even before execution.
/// </summary>
/// <param name="dueTime"></param>
/// <param name="action"></param>
internal static void ScheduleOnce(TimeSpan dueTime, Action action)
{
if (dueTime <= TimeSpan.Zero)
{
throw new ArgumentOutOfRangeException("dueTime", dueTime, "DueTime can only be greater than zero.");
}
Object obj = new Object();
Timer timer = new Timer(state =>
{
try
{
action();
}
catch (Exception ex)
{
_logger.ErrorFormat("Exception while executing timer. ex: {0}", ex);
}
finally
{
Timer removedTimer;
if (!_timers.TryRemove(obj, out removedTimer))
{
_logger.Error("Failed to remove timer from timers");
}
else
{
removedTimer.Dispose();
}
}
});
if (!_timers.TryAdd(obj, timer))
{
_logger.Error("Failed to add timer to timers");
}
timer.Change(dueTime, TimeSpan.FromMilliseconds(-1));
}
}
मैं हटा दिया टाइमर निपटान नहीं है, तो यह एक स्मृति रिसाव के साथ परिणाम है।
ऐसा लगता है कि टाइमर को _timers
संग्रह से हटा दिए जाने के बाद टाइमर के प्रतिनिधि को संदर्भित किया जा रहा है।
सवाल यह है कि, अगर मैं टाइमर का निपटान नहीं करता हूं तो मुझे मेमोरी रिसाव क्यों मिलती है?
शायद मैं, क्योंकि यह लग रहा है आप सोच रहे हैं की तरह क्यों कुछ असामान्य व्यवहार करता है जब आप इसे गाली समझ में नहीं आता कि तुम क्या कह रहे हैं ... –
मैं समझता हूं कि दस्तावेज कहता है कि घटकों का निपटान किया जाना चाहिए। मैं अभी भी उत्सुक हूं कि जीसी से निपटान विधि को बुलाए बिना टाइमर और दिए गए प्रतिनिधि को इकट्ठा करने से रोकता है। –