C# 单线程应用程序显示类似竞争条件的行为
我有一个很大的(约40mb)XML数据集合,分成许多格式不好的文件,因此我将它们合并,添加一个根节点,并将所有XML加载到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 />
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;
}