[英]Dispose writer after memoryStream
This is a piece of my code: 这是我的一部分代码:
private static MemoryStream outputStream;
public static void ConvertMp3ToWavStream(string inputPath)
{
outputStream = new MemoryStream();
using (Mp3FileReader reader = new Mp3FileReader(inputPath))
{
using (WaveStream waveStream = WaveFormatConversionStream.CreatePcmStream(reader))
{
WaveFileWriter waveFileWriter = new WaveFileWriter(outputStream, waveStream.WaveFormat);
byte[] bytes = new byte[waveStream.Length];
waveStream.Position = 0;
waveStream.Read(bytes, 0, (int)waveStream.Length);
waveFileWriter.Write(bytes, 0, bytes.Length);
waveFileWriter.Flush();
}
}
}
This is my CloseAndDispose
method, which I invoke after some manipulations: 这是我的
CloseAndDispose
方法,在进行一些操作后会调用该方法:
private static void CloseAndDispose()
{
if (outputStream != null)
{
outputStream.Close();
outputStream.Dispose();
}
}
The problem: after all actions I've got some memory in memory stack, which wasn't disposed. 问题是:在完成所有操作后,我在内存堆栈中有一些内存,没有被处置。 As I understand, It's my
writer
. 据我了解,这是我的
writer
。 When I try to dispose writer, I get an exception. 当我尝试处置作家时,我遇到了一个例外。 (can't read
MemoryStream
). (无法读取
MemoryStream
)。 When I try to close and dispose writer after CloseAndDispose()
method, I get an exception. 当我尝试在
CloseAndDispose()
方法之后关闭并处置writer时,出现异常。 Where should I close waveFileWriter
? 我应该在哪里关闭
waveFileWriter
?
NAudio has a helper class called IgnoreDisposeStream
in the NAudio.Utils
namespace. NAudio在
NAudio.Utils
命名空间中有一个名为IgnoreDisposeStream
的帮助程序类。 Wrap your memory stream in one of those before passing it into the WaveFileWriter
在将其传递到
WaveFileWriter
之前,将其中的存储器流包装为其中WaveFileWriter
using (var writer = new WaveFileWriter(new IgnoreDisposeStream(outputStream),
waveStream.WaveFormat))
{
...
}
You could pass a local MemoryStream
to WaveFileWriter
and copy it to the global one before it's disposed: 您可以将本地
MemoryStream
传递给WaveFileWriter
并在处置之前将其复制到全局WaveFileWriter
:
public static void ConvertMp3ToWavStream(string inputPath)
{
outputStream = new MemoryStream();
var outputStreamLocal = new MemoryStream();
using (...
{
using (var waveFileWriter = new WaveFileWriter(outputStreamLocal, ...
{
...
outputStreamLocal.CopyTo(outputStream);
}
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.