2012-07-17 8 views
6

मेरी कक्षा में से एक एप्लिकेशन निष्पादन के दौरान आंकड़े एकत्र करता है और मैं आवेदन समाप्त होने पर इस आंकड़ों को डिस्क पर संग्रहीत करना चाहता हूं। मैं अपने कार्यक्रम के अंदर इस वर्ग को नष्ट कभी नहीं तो मैं ऐसे ही फाइल करने के लिए दुकान लॉग की कोशिश की है:एप्लिकेशन बंद होने पर फ़ाइल को संग्रहीत करने के लिए सही तरीका

~Strategy() 
    { 
     foreach(var item in statisticItems) 
     { 
      log.WriteLine(item.Text); // log is AutoFlush 
     } 
    } 

हालांकि मैं लॉग मैं देखने की उम्मीद नहीं दिख रहा है और मैं भी नहीं "पकड़" डिबगर पल में जब कर सकते हैं नाशक बुलाया।

सवाल:

  • क्यों डिबगर में मैं पल जब नाशक कहा जाता है पकड़ नहीं कर सकते हैं? प्रोग्राम खत्म होने पर हर ऑब्जेक्ट के लिए विनाशक को नहीं बुलाया जाना चाहिए?
  • मुझे अपनी सामग्री लॉग इन करने के लिए क्या उपयोग करना चाहिए?
+0

क्या आप किसी भी मौके से स्टॉप बटन के साथ डीबगर बंद कर रहे हैं? – Blindy

+0

@ ब्लिंडी नहीं मैं बस विंडो बंद कर देता हूं – javapowered

+0

क्या 'रणनीति' तत्काल है? क्या यह एक स्थिर वर्ग है (या आप केवल इसकी स्थिर विधियों का उपयोग कर रहे हैं)? हमें अधिक जानकारी दें, मामलों का उपयोग करें, जो भी आप कर सकते हैं। आप अपनी समस्या के लिए ढांचे में एक बग छूट सकते हैं, यह आपके कोड में कुछ है, और हम केवल इस बिंदु पर अनुमान लगा सकते हैं। – Blindy

उत्तर

1

नाशक (या finalizer) ऐसा कोड डालने के लिए जगह नहीं है। यह अप्रबंधित संसाधनों को जारी करने के लिए डिज़ाइन किया गया है। विनाशकों को गैर-निर्धारिती कहा जाता है, इसलिए आप विनाशक के अंदर वैध होने वाली किसी भी वस्तु पर भरोसा नहीं कर सकते हैं। और आप इसे डीबगर में नहीं पकड़ सकते हैं क्योंकि इसे बहुत अलग परिस्थितियों में एक अलग धागे पर बुलाया जाता है। संक्षेप में, विनाशकों का उपयोग न करें, जब तक आपको पता न हो कि आपको इसकी आवश्यकता है।

एप्लिकेशन शट डाउन लॉग करने का आदर्श तरीका Main विधि के अंत में लॉगिंग कोड को बस रखना है। आपको यह सुनिश्चित करना चाहिए कि आप फेंकने वाले किसी भी अपवाद को पकड़ें और लॉग करें, और यदि ऐसा है, तो आप Main के अंत में शटडाउन लॉग कर सकते हैं।

कुछ किनारे के मामले होंगे जहां आप स्टैक ओवरफ़्लो जैसी त्रुटियों के कारण शट डाउन लॉग इन नहीं कर पाएंगे।उन मामलों में, आपको त्रुटि से पहले जो हुआ उससे लॉग पर भरोसा करना होगा।

+0

अच्छी सलाह के दौरान, इनमें से कोई भी अपने वास्तविक प्रश्न का उत्तर नहीं देता है ... – Blindy

+0

यह प्रश्न का उत्तर देता है "मुझे अपनी सामग्री लॉग करने के लिए क्या उपयोग करना चाहिए?" –

+0

अब यह अन्य प्रश्न भी संबोधित करता है। –

-1

विनाशकों पर भरोसा न करें। मैं कुछ इस तरह का उपयोग कर की सिफारिश करेंगे:

[STAThread] 
static void Main() 
{ 
    using(new Strategy()) 
    { 
     Application.EnableVisualStyles(); 
     Application.SetCompatibleTextRenderingDefault(false); 
     Application.Run(new Form1()); 
    } 
} 

public class Strategy : IDisposable 
{ 
    public void Dispose() 
    { 
     WriteLogs() 
    } 
    ... 
} 

इस तरह से आप यह सुनिश्चित करें कि आपके लॉग लिखा जाएगा रहे हैं।

स्थैतिक शून्य मुख्य को Windows प्रोग्राम अनुप्रयोग बनाते समय बनाई गई डिफ़ॉल्ट प्रोग्राम.cs से कॉपी किया गया है।

+0

-1 देखें। आपको इस सौदे से गड़बड़ नहीं करना चाहिए, असली सौदा का उपयोग करें। – Blindy

+0

आप 'STAThread' विशेषता का उपयोग क्यों कर रहे हैं जो COM afaik से संबंधित है? मुझे विनाशक पर भरोसा क्यों नहीं करना चाहिए? – javapowered

+0

'डिस्पोजेबल' विनाशकों पर एक अनुकूलन है (और उचित पैटर्न में विनाशक शामिल है), इसका मुख्य लाभ यह है कि यह आपको मांग पर संसाधन जारी करने की अनुमति देता है। – Blindy

-1

यह है नहीं पूरा जवाब (अभी तक), लेकिन यह बाहर की जाँच:

प्रोग्रामर जब नाशक कहा जाता है क्योंकि यह कचरा कलेक्टर से निर्धारित होता है पर कोई नियंत्रण नहीं है। कचरा कलेक्टर उन वस्तुओं के लिए जांच करता है जिनका उपयोग अब एप्लिकेशन द्वारा नहीं किया जा रहा है। यदि यह किसी ऑब्जेक्ट को विनाश के योग्य मानता है, तो यह विनाशक (यदि कोई है) को कॉल करता है और ऑब्जेक्ट ऑब्जेक्ट को संग्रहीत करने के लिए उपयोग की जाने वाली मेमोरी को पुनः प्राप्त करता है। जब कार्यक्रम निकलता है तो विनाशकों को भी बुलाया जाता है।

स्रोत: MSDN

यदि यह एक सांत्वना अनुप्रयोग है, तो आप Environment.Exit(0); बुला की कोशिश कर सकते हैं क्या होता है देखने के लिए?

चलो इस उत्तर को अद्यतन रखें, क्योंकि यह एक दिलचस्प सवाल है। कोई भी संपादित करने के लिए स्वतंत्र महसूस करता है।

सादर

+0

यदि आप विकी-शैली के उत्तर चाहते हैं, तो एक समुदाय विकी उत्तर जाने का तरीका है। –

+0

@ केंडलफ्रे अगर आप संपादित नहीं करना चाहते हैं, तो आपको यह नहीं करना है। फिर भी, मैंने ओपी को एक प्रश्न बना दिया है और मैं अपना जवाब सुधारने के लिए प्रतिक्रिया पर इंतजार कर रहा हूं। सिर्फ यह कहने से बेहतर "आप गलत हैं, इस तरह से करना चाहिए" –

+0

टिप्पणियां ओपी के प्रश्न पूछने की जगह हैं। जवाब उत्तर के लिए हैं। –

संबंधित मुद्दे

 संबंधित मुद्दे