75.00BlahBCD234CAGoldman55.00Ack我想并行运行计算;一个典型的输入文件可能有50,000个输入节点,没有线程的总处理时间可能为90分钟。大约90%的处理时间花费在步骤#2(计算)上。我可以轻松地并行迭代XmlReader:staticIEnumerableEnumerateAxis(XmlReaderreader,stringaxis){reader.MoveToContent();while(reader.Read()){switch(reader.NodeType){caseXmlNodeType.Element:if(reader.Name==axis){XElementel=XElement.ReadFrom(reader)asXElement;if(el!=null)yieldreturnel;}休息;}}}...Parallel.ForEach(EnumerateAxis(reader,"Input"),node=>{//计算//锁定XmlWriter,写入,解锁});我目前倾向于在写入XmlWriter时使用线程安全锁。在这种情况下,是否有更优雅的方式来处理XmlWriter?具体来说,我是否应该让Parallel.ForEach代码将结果传回原始线程并让该线程处理XmlWriter,从而避免需要锁?如果是这样,我不确定执行此操作的正确方法。这是我最喜欢的问题:一个可以用管道解决的问题。请注意,根据您的具体情况,这种方法实际上可能会对性能产生负面影响,但是当您明确询问如何在专用线程上使用编写器时,下面的代码将证明这一点。免责声明:理想情况下,您应该考虑TPL数据流,但这不是我精通的东西,所以我将采用熟悉的Task+BlockingCollection路线。起初我打算建议一个3阶段管道(读取、处理、写入),但后来我意识到您已经将前两个阶段与您在读取节点时“流式传输”节点的方式结合起来。将它们提供给您的Parallel.ForEach(是的,您已经实现了一系列管道)。更好的是——更少的线程同步。思考到这一点,代码现在变成了:publicclassResult{publicstringCase{get;放;}公共字符串状态{得到;放;}publicstringInvestor{get;放;}publicdecimalPrice{get;放;}publicstringProduct{get;放;}}…using(varreader=CreateXmlReader()){//我非常怀疑这个集合//是否会达到其有界容量,因为//处理阶段需要很长时间,//但如果确实如此,Parallel.ForEach//将被节流。using(varhandover=newBlockingCollection(boundedCapacity:100)){varprocessStage=Task.Run(()=>{try{Parallel.ForEach(EnumerateAxis(reader,"Input"),node=>{//计算。Thread.Sleep(1000);//移交给writer。//这个移交不是阻塞的(除非我们的//阻塞集合已经达到它的边界//容量,这表明//writer的运行速度比预期的要慢).handover.Add(newResult());});}最后{handover.CompleteAdding();}});变种写阶段=Task.Run(()=>{using(varwriter=CreateXmlReader()){foreach(varresultinhandover.GetConsumingEnumerable()){//写入元素。}}});//注意:这两个阶段现在并行运行。//从技术上讲,您可以使用Parallel.Invoke//以更少的代码实现相同的结果。Task.WaitAll(processStage,writeStage);}}structnodeParams{内部字符串状态;内部字符串投资者;内部双重价格;内部字符串产品;}内部ConcurrentDictionarycd=newConcurrentDictionary();然后修改你的代码:以上是C#学习教程:C#并行库、XmlReader、XmlWriter分享的全部内容,如果对大家有用还需要了解更多C#学习教程,希望大家多多关注——staticIEnumerableEnumerateAxis(XmlReaderreader,stringaxis){reader.MoveToContent();while(reader.Read()){switch(reader.NodeType){caseXmlNodeType.Element:if(reader.Name==axis){XElementel=XElement.ReadFrom(reader)asXElement;if(el!=null)yieldreturnel;}休息;}}}...Parallel.ForEach(EnumerateAxis(读者,"输入"),node=>{nodeParamsnp=newnodeParams();//计算并将结果放入np并使用Case作为键添加到cd});//根据cd的内容更新XMLdoc本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如有转载请注明出处:
