Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 单线程应用程序显示类似竞争条件的行为_C#_.net_Xml_Race Condition - Fatal编程技术网

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

C# 单线程应用程序显示类似竞争条件的行为,c#,.net,xml,race-condition,C#,.net,Xml,Race Condition,我有一个很大的(约40mb)XML数据集合,分成许多格式不好的文件,因此我将它们合并,添加一个根节点,并将所有XML加载到XmlDocument中。它基本上是3种不同类型的列表,可以用几种不同的方式嵌套。此示例应显示大多数情况: <Root> <A> <A> <A></A> <A></A> </A> </A> <A />

我有一个很大的(约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>

我不会首先在代码中直接使用XPath,而是使用诸如的工具来正确使用XPath。您可以加载原始XML,也可以使用原始XML的子集


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

好的,解决了这个问题
tableCreator
是我的策略模式的一部分,它影响表的构建方式。在某个实现中,我会这样做:

XmlNode xn = xmlDocument.SelectSingleNode(fancyXPath);
// if a node has ancestors, then its a linked list:
// <a><a><a></a></a></a>
if(xn.SelectSingleNode("a") != null)
    xn.SelectSingleNode("a").InnerText = "<IDs of linked list items CSV like here>";

这可能导致了这种奇怪的行为。

您能发布一下_xmlDocument是如何加载的吗?Pref关于CreateTable@Henk霍特曼编辑了我的文章。我读取字符串中的所有XML,添加并调用XmlDocument.LoadXml(字符串s)。我知道这很慢,而且会消耗内存,一旦它工作,它就会被分析和调整。乍一看,你有一个非常奇怪的问题。但是还有什么其他相关的吗?空的catch{}块?后台工作人员?没有涉及后台工作人员,但是我发现NPE没有被捕获,尽管main被try/catch包围。NPE与我的问题无关,但可能还有另一个未预料到的例外,我会看看。泰!这里没有奇特的xpath表达式,//A选择文档中类型A的所有节点。我知道这是正确的,我用xpath visualizer再次检查了两次。另外,如果我在正确的位置断开,它也能工作。可能发生的是
SelectNodes
中的某种惰性计算。如果中断到调试器并检查
xmlNodeList
,调试器将评估查询并生成节点列表,继续时,修改XML文档的事实不会影响列表,因为它已经生成。如果正在进行延迟计算,并且列表在执行
SelectNodes
时没有生成,而是在枚举时生成,则对文档的更改将更改列表。不过,这是一个疯狂的猜测。
XmlNode xn = xmlDocument.SelectSingleNode(fancyXPath);
// if a node has ancestors, then its a linked list:
// <a><a><a></a></a></a>
if(xn.SelectSingleNode("a") != null)
    xn.SelectSingleNode("a").InnerText = "<IDs of linked list items CSV like here>";
internal int ReadUntil(int index)
{
    int count = this.list.Count;
    while (!this.done && (count <= index))
    {
        if (this.nodeIterator.MoveNext())
        {
            XmlNode item = this.GetNode(this.nodeIterator.Current);
            if (item != null)
            {
                this.list.Add(item);
                count++;
            }
        }
        else
        {
            this.done = true;
            return count;
        }
    }
    return count;
}