-1

我正在使用内存流,并且遇到了一些内存不足异常的问题。导致问题的方法如下。

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 语句,但问题仍然存在。谢谢你的收获。

4

2 回答 2

2

当您将字节数组传递给MemoryStream构造函数时,该字节数组就是缓冲区。也许您仍然在调用代码中保留对该字节数组的引用?

您显示的代码不会保留数据(假设它实际上是分配一个局部变量,而不是分配给一个属性) - 处理流在这里绝对不重要,而且根本没有帮助。 .. a 中的数据MemoryStream即使在处置后仍然可用。

当然,如果您给出的代码确实准确,那么我建议您删除您的SerializerStream属性/字段。拥有重用现有属性/变量而不是声明新的局部变量的语句很少一个好主意。using

using (Stream stream = new MemoryStream(source))
{
    return (T) _formatter.Deserializer(stream);
}
于 2013-09-12T14:03:00.633 回答
0

本节使用 (Stream = new MemoryStream(source))似乎不正确,您在哪里声明Stream

如果您在使用范围或方法之外声明此变量,那么

using 语句(C# 参考)

您可以实例化资源对象,然后将变量传递给 using 语句,但这不是最佳实践。在这种情况下,对象在控制离开 using 块后仍保留在范围内,即使它可能不再有权访问其非托管资源。换句话说,它将不再被完全初始化。如果您尝试在 using 块之外使用该对象,则可能会引发异常。出于这个原因,通常最好在 using 语句中实例化对象并将其范围限制在 using 块中。

于 2013-09-12T14:03:41.660 回答