विनाशक अजीब हैं। मैं 'स्मार्ट' संदर्भ प्रबंधन का उपयोग करके डिस्पोजेबल पैटर्न का उपयोग करने की आवश्यकता को खत्म करने की कोशिश कर रहा था, यह सुनिश्चित करना कि कचरा कलेक्टर सही समय पर वस्तुओं को एकत्र कर सके। मेरे विनाशकों में से एक में मुझे किसी अन्य वस्तु से किसी ईवेंट की प्रतीक्षा करनी पड़ी, जिसे मैंने देखा कि यह नहीं था। आवेदन बस बंद हो गया और विनाशक निष्पादन के बीच में समाप्त कर दिया गया था। मुझे उम्मीद है कि एक विनाशक को हमेशा चलने की अनुमति दी जाती है, लेकिन जैसा कि निम्न परीक्षण इंगित करता है कि यह सत्य नहीं है।क्या विनाशक दौड़ने की गारंटी नहीं दे रहे हैं?
using System;
using System.Diagnostics;
using System.Threading;
namespace DestructorTest
{
class Program
{
static void Main(string[] args)
{
new DestructorTest();
new LoopDestructorTest();
using (new DisposableTest()) { }
}
}
class DestructorTest
{
~DestructorTest()
{
// This isn't allowed to finish.
Thread.Sleep(10000);
}
}
class LoopDestructorTest
{
~LoopDestructorTest()
{
int cur = 0;
for (int i = 0; i < int.MaxValue; ++i)
{
cur = i;
}
// This isn't allowed to finish.
Debug.WriteLine(cur);
}
}
class DisposableTest : IDisposable
{
public void Dispose()
{
// This of course, is allowed to finish.
Thread.Sleep(10000);
}
}
}
तो, विनाशकर्ता का चलना पूर्ण होने की गारंटी नहीं कर रहे हैं?
किसी अन्य ऑब्जेक्ट से किसी ऑब्जेक्ट की समाप्ति के लिए प्रतीक्षा करना? यह पागलपन है! – MattDavey
विश्वसनीय विनाश और संसाधन रिलीज के लिए आपको वास्तव में 'आईडीस्पोजेबल' पैटर्न के साथ रहना चाहिए। –
@MattDavey ... और किसी अन्य ऑब्जेक्ट से किसी ईवेंट की प्रतीक्षा करना जारी रखने के लिए 'निपटान()' पागलपन नहीं है? क्या फर्क पड़ता है? –