2012-06-07 17 views
38

हाय तक क्यों नहीं पहुंच सकता है क्यों using (var sw = new StreamWriter(ms))Cannot access a closed Streamexception देता है। Memory Stream इस कोड के शीर्ष पर है।मेमोरीस्ट्रीम - एक बंद स्ट्रीम

using (var ms = new MemoryStream()) 
{ 
    using (var sw = new StreamWriter(ms)) 
    {     
     sw.WriteLine("data"); 
     sw.WriteLine("data 2"); 
     ms.Position = 0; 
     using (var sr = new StreamReader(ms)) 
     { 
      Console.WriteLine(sr.ReadToEnd());       
     } 
    } //error here 
} 

इसे ठीक करने का सबसे अच्छा तरीका क्या है? धन्यवाद

+0

ऐसा इसलिए हो सकता है क्योंकि आप एक ही मेमोरीस्ट्रीम से StreamWriter और StreamReader बना रहे हैं। आप दो अलग-अलग मेमोरीस्ट्रीम का उपयोग करने का प्रयास कर सकते हैं: पाठक के लिए एक और लेखक के लिए एक। – NKamrath

+0

http://stackoverflow.com/questions/2331675/cannot-access-closed-stream – bytebuster

उत्तर

62

इसका कारण यह है StreamReader स्वचालित रूप से अंतर्निहित धारा बंद कर देता है है का निपटान किया जा रहा है। using कथन स्वचालित रूप से यह करता है।

हालांकि, StreamWriter आप उपयोग कर रहे अभी भी धारा पर काम करने के लिए कोशिश कर रहा है (यह भी, लेखक के लिए using बयान अब StreamWriter है, जो तब धारा बंद करने के लिए कोशिश कर रहा है के निपटान के लिए कोशिश कर रहा है)।

इसे ठीक करने का सबसे अच्छा तरीका यह है: using का उपयोग न करें और StreamReader और StreamWriter का निपटान न करें। this question देखें।

StreamWriter sw = null; 
StreamReader sr = null; 

try 
{ 
    using (var ms = new MemoryStream()) 
    { 
     sw = new StreamWriter(ms); 
     sr = new StreamReader(ms); 

     sw.WriteLine("data"); 
     sw.WriteLine("data 2"); 
     ms.Position = 0; 

     Console.WriteLine(sr.ReadToEnd());       
    } 
} 
finally 
{ 
    if (sw != null) sw.Dispose(); 
    if (sr != null) sr.Dispose(); 
} 
+0

का संभावित डुप्लिकेट वहां कोई संदेह नहीं है कि मैं मान रहा हूं कि क्यों ओपी ने पूछा "इसे ठीक करने का सबसे अच्छा तरीका क्या है?" –

+0

करीबी var sw = new StreamWriter (ms) के बारे में क्या; var sr = new StreamReader (ms);? –

+0

आपको उनके बारे में चिंता करने की आवश्यकता नहीं है। मैंने लिंक किए गए प्रश्न से स्वीकृत उत्तर उद्धृत किया है: * आपको चाहिए StreamReader को दायरे से बाहर जाने के द्वारा ठीक रहें यदि आपको सीधे अंतर्निहित धारा का उपयोग करने की आवश्यकता है। बस सुनिश्चित करें कि आप उचित होने पर अंतर्निहित स्ट्रीम को मैन्युअल रूप से निपटाना चाहते हैं। * दूसरे शब्दों में: जबकि पाठक और लेखक स्पष्ट रूप से निपटा नहीं जाते हैं, वे अंत में एकत्र कचरा होगा। लेकिन मैं एक और संभावित समाधान देने के लिए फिर से संपादित करूंगा। –

1

जब यह बयान Dispose विधि धारा

को बंद करने के लिए स्वचालित रूप बुलाया जाएगा का उपयोग करने से बाहर हो जाता है नीचे की कोशिश:

using (var ms = new MemoryStream()) 
{ 
    var sw = new StreamWriter(ms); 

     sw.WriteLine("data"); 
     sw.WriteLine("data 2"); 
     ms.Position = 0; 
     using (var sr = new StreamReader(ms)) 
     { 
      Console.WriteLine(sr.ReadToEnd()); 
     } 
}  
4

का उपयोग करते समय():

using (var ms = new MemoryStream()) 
{ 
    var sw = new StreamWriter(ms); 
    var sr = new StreamReader(ms); 

    sw.WriteLine("data"); 
    sw.WriteLine("data 2"); 
    ms.Position = 0; 

    Console.WriteLine(sr.ReadToEnd());       
} 

आप के बारे में sw और sr कचरा-एकत्र अपने कोड में निपटाया जा रहा है (के रूप में सिफारिश) के बिना किया जा रहा है बुरा लग रहा है, तो आप ऐसा ही कुछ कर सकता है आपके StreamReader समाप्त होने के लिए, यह ऑब्जेक्ट का निपटान कर रहा है और स्ट्रीम को बंद कर रहा है, जिसे आपका स्ट्रीमवाइटर अभी भी उपयोग करने का प्रयास कर रहा है।

using (var sr = new StreamReader(ms)) 
{ 
    Console.WriteLine(sr.ReadToEnd());       
} 

(का उपयोग कर छोड़ने के बाद) जब StreamReader बंद कर दिया है, यह बंद कर देता है यह धारा अंतर्निहित है और साथ ही है, इसलिए अब MemoryStream बंद कर दिया है:

+0

इसमें कोई संदेह नहीं है कि मैं मान रहा हूं कि क्यों ओपी ने पूछा "सबसे अच्छा तरीका क्या है इसे ठीक करने के लिए? " –

+1

इसमें कोई संदेह नहीं है कि आप यह क्यों कहते रहते हैं :-) – camainc

1

समस्या इस ब्लॉक है। जब StreamWriter बंद हो जाता है, तो यह सब कुछ MemoryStream पर फ़्लश करने का प्रयास करता है, लेकिन यह बंद है।

आपको किसी प्रयोग ब्लॉक में StreamReader डालने पर विचार नहीं करना चाहिए।

2

मेरे मामले में (वैसे बहुत रहस्यमय और संभावना नहीं अक्सर reproduced किया जाना है), इस समस्या पैदा कर रहा था (इस कोड को पीडीएफ पीढ़ी iTextSharp का उपयोग कर से संबंधित है):

PdfPTable tblDuckbilledPlatypi = new PdfPTable(3); 
float[] DuckbilledPlatypiRowWidths = new float[] { 42f, 76f }; 
tblDuckbilledPlatypi.SetWidths(DuckbilledPlatypiRowWidths); 

3- की घोषणा सेल/कॉलम वाली टेबल, और उसके बाद चौड़ाई के लिए केवल दो vals सेट करना समस्या का कारण बन गया था, जाहिर है। एक बार जब मैंने "पीडीएफपीटेबल (3)" को "पीडीएफपीटेबल (2)" में बदल दिया, तो समस्या संवहन ओवन का मार्ग बन गई।

+0

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

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