【发布时间】:2013-09-12 13:58:56
【问题描述】:
我正在处理内存流,并且遇到了一些内存不足异常的问题。导致问题的方法如下。
public override T Deserialize<T>(byte[] source)
{
using (var stream = new MemoryStream(source))
{
var result = (T)_formatter.Deserialize(stream);
return result;
}
}
这是一个典型的调用:
var bufferSize = binaryArrays.Sum(x => x.Length);
var streamBuffer = new byte[bufferSize];
using (var stream = new MemoryStream(streamBuffer))
{
foreach (var binaryArray in binaryArrays)
{
stream.Write(binaryArray, 0, binaryArray.Length);
}
result = serializer.Deserialize<T>(stream.ToArray());
}
我已经在这个方法的包含类中实现了IDisposable,并且我正在显式地处理流(即使它不应该是必需的)但我无法回收我的内存。我知道这是因为 MemoryStream 的底层缓冲区仍在浮动,并且我的应用程序的虚拟内存已耗尽。那么,如何杀死底层缓冲区呢?有什么我可以在这里使用的技术吗?
非常感谢。
[编辑]
我修复了 using 语句,但问题仍然存在。谢谢你的收获。
【问题讨论】:
-
同意@astander,流应该是本地的和/或发布时代码被损坏。
-
调用代码示例似乎也是错误的。请准确无误,尤其是关于声明缓冲区和资源对象的方式/位置。
-
@HenkHolterman:特别是“调用”代码不会调用
Deserialize:) -
不,但我假设该对象具有重写的反序列化。不清楚。
-
对不起,我在检索类中添加了调用。
标签: c# memory-management memory-leaks memorystream disposing