2009-12-08 13 views
19

नोट: मैं पहले से ही निम्नलिखित दो प्रश्नों पढ़ा है:समझौता स्ट्रीम और उनके जीवनकाल (फ्लश, निपटान, बंद)

Can you explain the concept of streams?

C# using streams

मैं सी #

में कोडिंग कर रहा हूँ
  1. कि धाराओं का उपयोग लगभग सभी कोड नमूने में, .Dispose(), .Flush(), .Close() लगभग हमेशा कहा जाता है।
    • एक धारा की अवधारणा में, क्या हासिल होता है?
    • मुझे लगता है कि मैं एक चर में संग्रहीत एक धारा निपटान नहीं है, तो अपने आवेदन कहीं लीक कर रहा है?
    • क्यों मैं इन कार्यों में से किसी को फोन करने की जरूरत है? मैं कोड नमूने है कि ऐसा नहीं करते हैं और अभी भी काम कर पाने (एक स्पष्ट टूटना बिना)

मैं वर्तमान में अपने आवेदन में एक वर्ग है कि एक प्राथमिक तरीका होता है निर्माण कर रहा हूँ देखा है (की सुविधा देता है यह GetStream() कहते हैं) के माध्यम से myWebRequest.GetResponse().GetResponseStream()

प्राथमिक विधि GetStream() एक Stream उद्देश्य यह है कि किसी भी कार्रवाई का एक धारा (StreamReader, बिटमैप() आदि) की आवश्यकता है के लिए इस्तेमाल किया जा सकता देता है एक धारा देता है।

क्या किसी भी व्यक्ति को मैन्युअल रूप से निपटाने के लिए .GetStream() पर कॉल करने वाले किसी भी व्यक्ति को मजबूर किए बिना स्ट्रीम को अपने अंतिम उपयोग (कचरा एकत्रित?) के बाद स्वचालित रूप से डिस्पोज़ करने का कोई तरीका है?

आप शायद बता सकते हैं के रूप में, मेरे सवालों का अस्पष्ट और सामान्य हैं। धाराओं की मेरी समझ ठोस नहीं है, इसलिए सहायक लेखों के किसी भी लिंक जो एसओ प्रश्न की तुलना में धाराओं में अधिक गहराई से देखने की पेशकश करते हैं, की सराहना की जाएगी।

उत्तर

28

एक धारा निपटान यह बंद कर देता है (और शायद बहुत कुछ और नहीं करता है।) एक धारा समापन यह flushes, और विज्ञप्ति धारा से संबंधित, एक फ़ाइल हैंडल की तरह किसी भी संसाधनों। स्ट्रीम को फ़्लश करने से कोई भी बफर किया गया डेटा लेता है जिसे अभी तक लिखा नहीं गया है, और इसे तुरंत लिखता है; डिस्क स्ट्रीम या नेटवर्क पाइप जैसे अपेक्षाकृत महंगे संसाधनों के लिए छोटे अपडेटों का एक टन बनाने से बचने के लिए कुछ धाराएं आंतरिक रूप से बफरिंग का उपयोग करती हैं।

आप या तो Close या सबसे धाराओं पर Dispose, या आपका कोड गलत है, क्योंकि अंतर्निहित संसाधन किसी और जब तक कचरा कलेक्टर आता है का उपयोग करने के लिए मुक्त नहीं किया जाएगा (कौन जानता है कि कब तक ले लेंगे कॉल करने की आवश्यकता ।) Dispose निश्चित रूप से एक मामले के रूप में पसंद किया जाता है; यह उम्मीद की जाती है कि आप सी # में सभी डिस्पोजेबल चीजों का निपटान करेंगे। आपको शायद अधिकांश परिदृश्यों में Flush पर कॉल करने की आवश्यकता नहीं है।

using (FileStream stream = new FileStream(path)) 
{ 
    // ... 
} 

है कार्यात्मक

के समान:

सी # में, यह मुहावरेदार एक using ब्लॉक है, जो एक कोशिश अंत में ब्लॉक है कि अंत में disposes के लिए वाक्यात्मक चीनी है, उदाहरण के लिए के माध्यम से Dispose कॉल करने के लिए है

FileStream stream; 

try 
{ 
    stream = new FileStream(path); 
    // ... 
} 
finally 
{ 
    if (stream != null) 
     stream.Dispose(); 
} 
+2

आखिरकार होना चाहिए: 'अगर (स्ट्रीम IDISposable है) ((IDISposable) स्ट्रीम)।निपटान(); – Gonzalo

+10

यह एक चरणीय पर 'उपयोग' का उपयोग करने के लिए एक कंपाइलर त्रुटि है जिसे IDisposable के रूप में जाना जाता है। हालांकि यह तकनीकी रूप से होना चाहिए: यदि (स्ट्रीम! = शून्य) धारा। उद्देश्य(); –

+0

कई मामलों में एक स्ट्रीम को स्पष्ट रूप से बंद करना एक अच्छा विचार है, भले ही कोई 'निपटान' भी कहता हो। किसी स्ट्रीम को बंद करने के लिए उन क्रियाओं को करने की आवश्यकता हो सकती है जिन्हें सफल होने की गारंटी नहीं दी जा सकती है; 'बंद' के कार्यान्वयन आम तौर पर ऐसी अपवाद फेंकते हैं जब कुछ समस्याएं होती हैं, जबकि कुछ 'निपटान' कार्यान्वयन ऐसे अपवादों को बाधित कर सकते हैं (ऐसे अपवादों को निगलना बुरा है, लेकिन उन्हें 'निपटान' से प्रचार करने की इजाजत देने से पहले पिछले अपवाद को रोक दिया जाएगा, जो कि बुरा भी है; कार्यान्वयन अलग-अलग होते हैं जिसके लिए बुराई कम माना जाता है)। – supercat

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