这是我的代码的简化版
Processor processor = new Processor();
DocumentBuilder documentBuilder = processor.NewDocumentBuilder();
documentBuilder.IsLineNumbering = true;
documentBuilder.WhitespacePolicy = WhitespacePolicy.PreserveAll;
XQueryCompiler compiler = processor.NewXQueryCompiler();
string query = BuildXqueryString();
if (!String.IsNullOrEmpty(query))
{
XQueryExecutable executable = compiler.Compile(query);
XQueryEvaluator evaluator = executable.Load();
evaluator.ContextItem = documentBuilder.Build(xmlNode);
var evaluations = evaluator.Evaluate();
foreach (var evaluation in evaluations)
runEvaluation((XdmNode)evaluation, document);
}
这就是我现在所拥有的,它按预期工作。现在我们正在进行一些更改以并行化评估,并且我在修改最后一个foreach以将其更改为Parallel.ForEach时遇到问题。这是我的新代码取代了foreach:
List<XdmNode> evaluationsAsList = evaluations.GetList().Cast<XdmNode().ToList();
Parallel.ForEach(evaluationsAsList, evaluation =>
runEvaluation(evaluation, document)
);
此代码失败,因为GetList()
正在为我返回net.sf.saxon.tree.tiny.TinyElementImpl
而非Saxon.Api.XdmNode
的列表。根据文档GetList()
,应始终至少返回Saxon.Api.XdmItem
列表,但情况并非如此。
有什么想法吗?
答案 0 :(得分:0)
看起来像个错误。我已将其记录在此处以采取行动:
https://saxonica.plan.io/issues/3006
从检查代码开始,在XdmValue是单例XdmItem的情况下,它看起来好像GetList()是错误的。因此,在我们生成修复程序之前,您可以通过测试XdmValue.Count并以不同方式处理单例情形来解决此问题。