Почему в данном фрагменте кода происходит memory leak?
Почему в данном фрагменте кода происходи memory leak?
Насколько я понимаю, то берётся копия потока, над ней выполняются операции, а затем в памяти "оригинальный поток" заменяется копией?
protected virtual Stream RenderXhtml(Stream inputDocumentStream, IFormatType styleSheetInfo)
{
var docReader = XmlReader.Create(inputDocumentStream);
var xhtmlStream = styleSheetInfo.TransformXmlDoc(docReader, this.BuildTransformParam());
inputDocumentStream.Seek(0, SeekOrigin.Begin);
xhtmlStream.Seek(0, SeekOrigin.Begin);
CreateFileDump(xhtmlStream, ".html");
xhtmlStream = TableConverter.ConvertTablesToImages(xhtmlStream, publicationName);
return xhtmlStream;
}
Ответы (1 шт):
Автор решения: aepot
→ Ссылка
Здесь пару потоков лишних задиспозить не мешало бы.
Использование объектов, реализующих IDisposable
protected virtual Stream RenderXhtml(Stream inputDocumentStream, IFormatType styleSheetInfo)
{
inputDocumentStream.Seek(0, SeekOrigin.Begin);
using var docReader = XmlReader.Create(inputDocumentStream);
using var xhtmlStream = styleSheetInfo.TransformXmlDoc(docReader, this.BuildTransformParam());
CreateFileDump(xhtmlStream, ".html");
xhtmlStream.Seek(0, SeekOrigin.Begin);
return TableConverter.ConvertTablesToImages(xhtmlStream, publicationName);
}
Но вообще точное решение очень сильно зависит от поведения вызываемых методов. Например неизвестно, у ConvertTablesToImages жадное поведение или ленивое. Во втором случае диспозить созданные потоки нельзя, их должен закрывать сам метод ConvertTablesToImages по окончании использования, либо у него должен был аргумент, отвечающий за управление таким поведением.