90

こんにちはなぜ using (var sw = new StreamWriter(ms))戻りますCannot access a closed Stream exceptionMemory 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
}

それを修正するための最良の方法は何ですか?ありがとう

4

6 に答える 6

129

これは、StreamReader廃棄時に基になるストリームを自動的に閉じるためです。usingステートメントはこれを自動的に行います。

ただし、StreamWriter使用しているユーザーはまだストリームを処理しようとしています(また、usingライターのステートメントは、ストリームを閉じようとしているを破棄StreamWriterしようとしています)。

これを修正する最善の方法は、とを使用しusingたり、破棄したりしないことです。この質問を参照してください。StreamReaderStreamWriter

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

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();
}
于 2012-06-07T15:16:33.247 に答える
33

.net45以降、のLeaveOpenコンストラクター引数をStreamWriter使用しても、usingステートメントを使用できます。例:

using (var ms = new MemoryStream())
{
    using (var sw = new StreamWriter(ms, leaveOpen:true))
    {
        sw.WriteLine("data");
        sw.WriteLine("data 2");    
    }

    ms.Position = 0;
    using (var sr = new StreamReader(ms))
    {
        Console.WriteLine(sr.ReadToEnd());
    }
}
于 2018-04-13T11:49:55.207 に答える
8

using()for yourが終了するStreamReaderと、オブジェクトを破棄してストリームを閉じますが、これStreamWriterはまだ使用しようとしています。

于 2012-06-07T15:16:48.633 に答える
1

問題はこのブロックです:

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

StreamReader閉じられると(使用を終了した後)、基になるストリームも閉じられるため、MemoryStreamが閉じられます。がStreamWriter閉じられると、すべてをにフラッシュしようとしますが、MemoryStream閉じられます。

StreamReaderをusingブロックに入れないことを検討する必要があります。

于 2012-06-07T15:17:32.463 に答える
1

usingステートメントから出ると、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());
        }
}    
于 2012-06-07T15:13:13.637 に答える
0

私の場合(確かに非常に難解で、頻繁に再現される可能性は低いです)、これが問題を引き起こしていました(このコードはiTextSharpを使用したPDF生成に関連しています):

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

3セル/列のテーブルを宣言し、幅に2つの値のみを設定したことが、明らかに問題の原因でした。「PdfPTable(3)」を「PdfPTable(2)」に変更すると、問題は対流式オーブンに行き着きました。

于 2015-05-18T20:45:15.313 に答える