C#:Xml.Load的接近方法(文件)(C# : the close method of Xml.

2019-06-25 11:05发布

我写了使用加载XML文档的一些代码XmlDocument对象,以计算它的节点。 这里是方法:

XmlDocument xml = new XmlDocument();
xml.Load(textBox1.Text);
XmlNodeList nodes = xml.SelectNodes("//File");
foreach (XmlNode node in nodes)
{
    number_of_childs++;
}

我现在面临的问题是,导入大量文件时,它需要像RAM 700MB。 如果我再尝试做对文件中的一些操作,甚至可以从中读出的,以显示其数据ListView ,应用程序需要像2GB的RAM。 所以,我想知道,有没有关闭的方法XmlDocument并释放其内存,释放内存。 它就像它忘记从内存中删除的内容。

Answer 1:

号的XmlDocument类不实现IDisposable ,所以没有办法迫使它随意释放它的资源。 如果你真的需要立即释放被使用的内存XmlDocument ,要做到这一点的唯一方法是做到以下几点:

nodes = null;
xml = null;
GC.Collect();

垃圾收集器工作在一个单独的线程,所以它可能仍然不会立即发生。 要强制垃圾收集同步发生,继续执行你的代码之前,你还必须调用WaitForPendingFinalizers ,因为这样的:

nodes = null;
xml = null;
GC.Collect();
GC.WaitForPendingFinalizers();

XmlDocument总是加载整个文档到内存中一次。 如果您只是想通过节点的文档作为流中的迭代,每次只装了一下,那是什么样XmlReader类是。 但是,你失去了很多的功能的方式。 举例来说,有没有办法通过XPath来选择的节点,因为你在哪里在你的例子做。 随着XmlReader ,你必须编写自己的逻辑来确定你在哪里,在文档中,以及是否符合你在找什么。



Answer 2:

如果你没有操纵XML,使用的XMLReader只是读取XML,即单向和最快的速度,用更少的内存紧张作业。



Answer 3:

有没有必要给你的对象设置为null。 如果文档不使用任何进一步的它自己的GC应该能够指示。 如需要的内存这将自动发生,但如果你想清除它立即调用GC.Collect的() 。 见这个线程作进一步讨论。



文章来源: C# : the close method of Xml.Load(file)