如何从NameTable类派生以减轻XmlReader内存泄漏?

| 本文说,使用XMLReader会导致字符串内存泄漏。 (只需搜索“内存泄漏”以找到该段落)。它说缓解措施之一是:   一种缓解方法是推导   从NameTable类并强制执行   最大大小配额。 (不可能   防止使用NameTable,或者   切换NameTable时   充分) 这里也提到了相同的问题和缓解措施。我的问题是,如文章所建议,如何“从NameTable类派生并强制使用最大大小配额”?     
已邀请:
        我不知道这是否是唯一的方法,但是在WCF(您已经有这样的配额,MaxNameTableCharCount)中完成的工作是创建System.Xml.XmlReader的子类,或者通过实现阅读器可以自己运行(不好玩),或者委派给内部阅读器使用(更有可能)。您可以重写虚拟NameTable属性以返回自己的XmlNameTable实现。此实现可以简单地将调用委派给原始名称表,但可以为其大小强制执行一些配额。 如果您需要解析的XML符合WCF阅读器支持的子集(即没有处理指令,没有实体引用,没有DTD),则可以直接使用WCF阅读器(它们可以在服务之外使用)。 XmlDictionaryReader.CreateTextReader使用一个参数,该参数包含要在阅读器上强制执行的配额,其中一个配额与名称表完全相同。     
        这不是您问题的答案,但可以帮助减轻您的“ C#内存泄漏问题”。 对C#使用RAII模式,您既可以处置非托管资源,也可以(随着对象超出范围)让GC处置托管资源。 我在工作中使用的代码如下:
void ParseXmlString(string p_xmlString)
{
   using (var stringReader = new StringReader(p_xmlString))
   using (var xmlReader = XmlReader.Create(stringReader))
   {
      while (xmlReader.Read())
      {
         // etc.
      }
   }
}
如您所见,xmlReader(和stringReader)变量是为每个解析尝试(*)创建的局部变量。 意味着将对其进行收集(**),从而避免了虚拟内存泄漏。 查看XmlReader类,我看不到任何方法来覆盖NameTable,因此也看不到提供替代实现的方法。 抱歉。 (*)这不适合您的项目,但是适合我的项目,所以... (**)我希望...您永远不会知道GC,但是您仍然可以尝试
System.GC.Collect()
    

要回复问题请先登录注册