메모리 스트림 - 닫힌 스트림에 액세스할 수 없음
안녕 왜?using (var sw = new StreamWriter(ms))
돌아온다Cannot access a closed Stream
exception
.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
}
그것을 고치는 가장 좋은 방법은 무엇입니까?감사해요.
그 이유는StreamReader
삭제할 때 기본 스트림을 자동으로 닫습니다.그using
문은 이 작업을 자동으로 수행합니다.
하지만, 그StreamWriter
당신이 사용하고 있는 것은 여전히 스트림에서 작업하려고 합니다(또한,using
작가를 위한 진술은 이제 처분하려고 노력하고 있습니다.StreamWriter
이는 스트림을 닫으려고 시도하는 것입니다.
이 문제를 해결하는 가장 좋은 방법은 다음과 같습니다.using
그리고 그것을 처분하지 마세요.StreamReader
그리고.StreamWriter
이 질문을 참조하십시오.
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();
}
.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());
}
}
그 때.using()
당신을 위하여StreamReader
종료됩니다. 객체를 배치하고 스트림을 닫는 것입니다.StreamWriter
계속 사용하려고 합니다.
문제는 다음 블록입니다.
using (var sr = new StreamReader(ms))
{
Console.WriteLine(sr.ReadToEnd());
}
그 때.StreamReader
닫힘(사용을 종료한 후), 기본 스트림도 닫힙니다. 따라서 이제MemoryStream
마감되었습니다.그 때.StreamWriter
닫히고, 그것은 모든 것을 플러시하려고 시도합니다.MemoryStream
하지만 문을 닫았습니다.
당신은 그것을 넣지 않는 것을 고려해야 합니다.StreamReader
사용 구역에서
그것이 사용 명세서에서 나왔을 때.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());
}
}
스트림을 읽을 수 있으려면 스트림을 열어 두어야 합니다. "StreamWriter"는 쓰기가 완료된 후 스트림을 닫습니다.
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());
}
} //error here
}
제 경우(분명히 매우 난해하고 자주 복제될 것 같지 않음) 문제가 발생했습니다(이 코드는 iTextSharp를 사용한 PDF 생성과 관련됨).
PdfPTable tblDuckbilledPlatypi = new PdfPTable(3);
float[] DuckbilledPlatypiRowWidths = new float[] { 42f, 76f };
tblDuckbilledPlatypi.SetWidths(DuckbilledPlatypiRowWidths);
3셀/칼럼 테이블을 선언한 다음 폭에 대해 두 개의 밸브만 설정한 것이 문제를 일으킨 것으로 보입니다.제가 "PdfPTable(3)"을 "PdfPTable(2)"로 바꾸자, 문제는 대류 오븐으로 넘어갔습니다.
언급URL : https://stackoverflow.com/questions/10934585/memorystream-cannot-access-a-closed-stream
'programing' 카테고리의 다른 글
Windows 탐색기를 열고 파일 선택 (0) | 2023.04.26 |
---|---|
"실제" CultureInfo를 사용합니다.IetfLanguageTag의 CultureInfo가 아닌 WPF 바인딩의 현재 Culture (0) | 2023.04.26 |
앱이 포그라운드 iOS에 있는 동안 푸시 알림 받기 (0) | 2023.04.26 |
10개의 무료 사이트 계정에 대한 Azure 임계값은 무엇입니까, 이것은 평생입니까. (0) | 2023.04.26 |
routerLink를 사용하여 쿼리 매개 변수를 전달하는 방법 (0) | 2023.04.26 |