c# - 单线程应用程序显示类似竞争条件的行为

标签 c# .net xml race-condition

我有一个很大(~40mb)的 XML 数据集合,分成许多格式不正确的文件,所以我合并它们,添加一个根节点并将所有 xml 加载到 XmlDocument .它基本上是 3 种不同类型的列表,可以用几种不同的方式嵌套。此示例应显示大多数情况:

<Root>
  <A>
    <A>
      <A></A>
      <A></A>
    </A>
  </A>
  <A />
  <B>
    <A>
      <A>
        <A></A>
        <A></A>
      </A>
    </A>
  </B>
  <C />
</Root>

我通过在 XmlDocument 上使用 XPath 表达式来分隔所有 A、B 和 C 节点(//A//B//C), 将生成的节点集转换为数据表,并在 Datagridview 中分别显示每个节点类型的所有节点的列表。这很好用。

但现在我面对的是一个更大的文件,我一加载它,它就只显示 4 行。然后我在实际 XmlDocument.SelectNodes 发生的行添加了一个断点,并检查了生成的 NodeSet。它向我展示了大约 25,000 个条目。在继续加载程序并大声疾呼之后,显示了我所有的 25k 行。我又试了一次,我可以重现它。如果我手动跨过 XmlDocument.SelectNodes,它就可以工作。如果我不在那里休息,它不会。我没有在我的应用程序中生成单个线程。

我怎样才能进一步调试它?要找什么?我在 jsch (ssh) 等多线程库中遇到过这种行为,但我不明白为什么在我的情况下会发生这种情况。

非常感谢!

// class XmlToDataTable:
private DataTable CreateTable(NamedXPath logType,
                              List<XmlColumn> columns,
                              ITableCreator tableCreator)
{
    // I have to break here -->
    XmlNodeList xmlNodeList = logFile.GetEntries(logType);
    // <-- I have to break here

    DataTable dataTable = tableCreator.CreateTableLayout(columns);
    foreach (XmlNode xmlNode in xmlNodeList)
    {
        DataRow row = dataTable.NewRow();
        tableCreator.PopulateRow(xmlNode, row, columns);
        dataTable.Rows.Add(row);
    }
    return dataTable;
}

// class Logfile:
public XmlNodeList GetEntries(NamedXPath e)
{
    return (_xmlDocument != null && _xmlDocument.HasChildNodes)
                         ? _xmlDocument.SelectNodes(e.XPath)
                         : new XmlNullObjectNodeList();
}
// _xmlDocument gets loaded here after reading all xml fragments into a string
// (ugly, i know. the  // ugly! comment reminds me about that ;))
private void CreateXmlDoc()
{
    _xmlDocument = new XmlDocument();
    _xmlDocument.LoadXml(OPEN_ROOT_ELEMENT + _xmlString +
                             CLOSE_ROOT_ELEMENT);
    if (DataChanged != null)
        DataChanged(this, new EventArgs());
}

// class NamedXPath:
public abstract class NamedXPath
{
    private readonly String _name;
    private readonly String _xPath;
    protected NamedXPath(string name, string xPath)
    {
        _name = name;
        _xPath = xPath;
    }

    public string Name
    {
        get { return _name; }
    }

    public string XPath
    {
        get { return _xPath; }
    }
}

最佳答案

与其先在代码中直接使用 XPath,不如使用 sketchPath 之类的工具让我的 XPath 正确。您可以加载原始 XML 或使用原始 XML 的子集。

尝试使用 XPath 和您的 XML 来查看在您的代码中使用 xpath 之前是否选择了预期的节点。

关于c# - 单线程应用程序显示类似竞争条件的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3758363/

相关文章:

c# windows azure - 对实体、模型或 POCO 进行排队

c# - 使用最小起订量从属性返回真实对象

c# - 在 Excel 中更改 CellValue 中文本的字体颜色 - OpenXml

c# - 将 C# 运行时代码编译为 native 汇编代码(可从 C++ 应用程序调用)的 .dll 的方法?

c# - DateTimeOffset 到 DateTime 的转换 - 数据丢失

c# - 如何处理您想要扩展的类,该类密封在 .NET 库中?

python - 通过 'ElementTree' 在 Python 中使用命名空间解析 XML

c# - GridView 控件中的超链接

xml - 如何通过 XPath 选择命名空间值

java - 在 Android TextView 中对齐文本和图标