这是一个类似代码的简单代码,我在项目中使用:
MemoryStream outputStream = new MemoryStream();
using (Mp3FileReader reader = new Mp3FileReader(@"C:\Users\practice\Desktop\111.mp3"))
{
Console.WriteLine("Reader");
Console.ReadLine();
using (WaveStream waveStream = WaveFormatConversionStream.CreatePcmStream(reader))
{
Console.WriteLine("waveStream");
Console.ReadLine();
using (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();
outputStream.Position = 0;
Console.WriteLine("MAIN STREAM");
Console.ReadLine();
}
}
}
outputStream.Dispose();
Console.WriteLine("MAIN STREAM DISPOSE");
Console.ReadLine();
如您所见,我将一些字节写入outputStream
。问题:在Dispose()之后我可以在Task Manager
中看到资源不是免费的。如何清理outputStream的堆内存?我只试过using
,但我得到的结果相同。
答案 0 :(得分:0)
首先,您应该在MemoryStream
语句中使用using
(或任何IDisposable对象),这是try / finally块的语法糖。
using(MemoryStream outputStream = new MemoryStream())
using (Mp3FileReader reader = new Mp3FileReader(@"C:\Users\practice\Desktop\111.mp3"))
{
// code
}
其次,在MemoryStream中调用Dispose会关闭流,并释放句柄。这并不意味着内存将立即释放。这是垃圾收集的工作。