0

我有一本字典:

Dictionary<string, List<string>>

以及一种遍历目录并将信息保存在该字典中的方法

public void TraverseDirectory(string startDir)
{
    //this.CreateNewFileWatcher(startDir);
    Dictionary<string, List<string>> dirsDictionary = new Dictionary<string, List<string>>();
    Dictionary<string, List<string>> filesDictionary = new Dictionary<string, List<string>>();
    Stack<DirectoryInfo> currentDirectorries = new Stack<DirectoryInfo>();
    DirectoryInfo startDirInfo = new DirectoryInfo(startDir);
    currentDirectorries.Push(startDirInfo);
    while (currentDirectorries.Count > 0)
    {
        var dir = currentDirectorries.Pop();
        this.AddNewDir(dir, dirsDictionary);
        try
        {
            var currentDirs = dir.GetDirectories();
            foreach (var currentDir in currentDirs)
            {
                currentDirectorries.Push(currentDir);
                try
                {
                    var files = currentDir.GetFiles();
                    foreach (var file in files)
                    {
                        this.AddNewFile(file, filesDictionary);
                    }
                }
                catch (UnauthorizedAccessException) { }
            }
        }
        catch (UnauthorizedAccessException) { }
    }

    dirsDictionary.Clear();
    filesDictionary.Clear();
}

基本上 AddNewDir 和 AddNewFile 方法将文件/目录添加到字典中,它们更多地用于测试目的。如您所见,字典仅在该方法中有效,但之后它们不会释放内存,在好的情况下会增加到 100mb。我将该信息保存到 MemoryMappedFiles 中,其中的信息是临时的。

你知道为什么内存没有被释放吗?

问候

4

1 回答 1

3

如果它真的不需要,.NET 不会释放内存。在一个紧凑的周期中,内存增加数十 mb 是很常见的。如果要检查内存是否可回收,请尝试添加:

GC.Collect();
GC.WaitForPendingFinalizers();

请注意,最后通常您不需要使用这些命令。如果 GC 需要更多内存(或程序因某些原因暂停时),GC 将释放内存

于 2013-09-01T17:38:21.007 回答