XmlReader内存泄漏.Net Core 2.0

时间:2018-10-04 16:13:00

标签: c# asp.net-core-2.0 xmlserializer

我有一个.NET Core 2.0,它正在处理超过30,000个XML文件的列表,并且似乎存在内存泄漏。

现在我所要做的就是一次读取一个文件,将文件内容添加到列表中,然后移至下一个文件。

这些文件没有任何反应,但是每个文件我的程序内存正在增加.5 MB。文件本身在5KB-10KB之间。

这是处理方法。

public async Task ProcessModelFile<TModel>(List<string> dataFileList) where TModel : InstitutionModel
    {
        foreach (var file in dataFileList)
        {
            var xmlLoadFile = new XmlLoadFile<TModel>();
            xmlLoadFile.AddFile(file, rootElementName: $"ArrayOf{TextService.GetClassNameFromType<TModel>()}");
        }
    }

以及AddFile方法和类:

internal class XmlLoadFile<TModel> where TModel : class
        {

            public List<TModel> ModelList { get; set; }

            internal void AddFile(string file, string rootElementName = "", bool HasHistoricalCutOff = false, DateTime? HistoricalCutOffDate = null)
            {
                using (XmlReader reader = XmlReader.Create(file, new XmlReaderSettings { CheckCharacters = false }))
                {
                    XmlSerializer serializer;

                    if (!string.IsNullOrWhiteSpace(rootElementName))
                    {
                        XmlRootAttribute rootElement = new XmlRootAttribute();
                        rootElement.ElementName = rootElementName;
                        serializer = new XmlSerializer(typeof(List<TModel>), rootElement);
                    }
                    else
                    {
                        serializer = new XmlSerializer(typeof(List<TModel>));
                    }

                    ModelList.AddRange((List<TModel>)serializer.Deserialize(reader));
                }
            }
        }

每次foreach循环运行时,我的内存都会增加.5MB,并且随着我拥有的文件数量的增加,它很快就会超过15GB。在VS中进行调试并为该内存拍摄快照时,它不会考虑正在使用的内存。

垃圾回收似乎无法正确释放此内存。

1 个答案:

答案 0 :(得分:0)

XmlSerializers会被缓存,因此只有在使用正确的构造函数的情况下,运行时才可以重建一个运行时。