此代码会导致某种内存泄漏。我认为这是由new byte[]引起的。
但是GC是否应避免这种情况?如果程序运行足够长时间,则代码将导致OutOfMemoryException

using (var file = new FileStream(fileLoc, FileMode.Open))
{
    int chunkSize = 1024 * 100;
    while (file.Position < file.Length)
    {
        if (file.Length - file.Position < chunkSize)
        {
            chunkSize = (int)(file.Length - file.Position);
        }
        byte[] chunk = new byte[chunkSize];
        file.Read(chunk, 0, chunkSize);
        context.Response.BinaryWrite(chunk);
    }
}

最佳答案

问题几乎可以肯定是您在重复分配新数组,并在内存中将它们分配为连续的块,因此我可以理解它是如何通过它咀嚼的。

如何稍微重新调整一下内容,以便只创建一次缓冲区然后再使用它,除非您进入所需的块大小小于标准块大小的情况。

using (var file = new FileStream(fileLoc, FileMode.Open)) {
    int chunkSize = 1024 * 100;
    byte[] chunk = new byte[chunkSize];

    while (file.Position < file.Length) {
        if (file.Length - file.Position < chunkSize) {
            chunkSize = (int)(file.Length - file.Position);
            chunk = new byte[chunkSize];
        }
        file.Read(chunk, 0, chunkSize);
        context.Response.BinaryWrite(chunk);
    }
}

关于c# - C#中的OutOfMemoryException,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9379847/

10-09 08:19