c#并行编程修改xDocument

本文关键字:xDocument 修改 编程 并行 | 更新日期: 2023-09-27 18:14:37

我从来没有尝试过c#并行编程。所以,在我开始之前,我希望我能得到一个快速的答案,知道它是否值得深入研究。我有。net 4.0的c# WCF web服务应用程序。(如果并行编程工作,可以升级到4.5)

所有服务都是REST服务。有一项服务需要花费很长时间。服务正在处理和修改xml文档。服务接受XML字符串作为输入,并返回修改后的XML文件。

服务在不同的位置和不同的元素中处理xml。因此,我创建了从一个名为IDocumentProcessor的接口继承的类,并且我有一个这些

的列表

代码大致如下

interface IDocumentProcessor {
     void Process(XDocument doc);
}
public class DateProcessor : IDocumentProcessor
{
   public void Process(XDocument doc) {....};
}
public class CountryProcessor : IDocumentProcessor
{
   public void Process(XDocument doc) {....};
}

public class AddressProcessor : IDocumentProcessor
{
   public void Process(XDocument doc) {....};
}

public class AuthorProcessor : IDocumentProcessor
{
   public void Process(XDocument doc) {....};
}
....
Public class DocumentProcessorService
{
    public class ProcessDocument(string xmlFileAsString) 
    {
        var processorList = new List<IDocumentProcessor>{
            new DateProcessor();
            new CountryProcessor();
            new AddressProcessor();
            new AuthorProcessor();
        }
        var xDocument = XDocument.Parse(xmlFileAsString);
        processorList.forEach(x => x.Process(xDocument));
    }
}

所以我的快速问题,在我深入研究这个类比之前:并行计算可以修改相同的xDocument对象(在不同的位置)吗

,这段代码可以翻译成并行计算与。net 4.0?

c#并行编程修改xDocument

来自XElement文档:

线程安全这种类型的任何公共静态(在Visual Basic中共享)成员都是线程安全的。不能保证任何实例成员都是线程安全的。

这基本上意味着你不能并行地修改XDocument。

另一个问题是,在相同的数据上对一种类型的操作进行分叉是不实际的。

这样是不可伸缩的

对于每个CPU内核,可能没有足够的操作类型用于fork,并且一种类型可能比另一种类型完成得更快。而且竞争很激烈。

如果您的文档包含类似方案的高级元素的集合,您可以并行处理它们的副本,然后用新副本替换旧副本。

重组操作必须在一个线程中完成,如果选择正确的粒度级别,应该不会太昂贵。

基本上每个要处理的XElement都需要一个复制构造函数。

    var newElements = collectionElement.Elements().Select(el=>
    Process(new XElement(el))).AsParallel();
  var newCollection = new XElement("items", newElements);

可以多个线程同时修改XDocument的实例-是的,没有什么显式地阻止线程进行更改(不像WinForms/WPF中的UI操作)。

但是由于XDocument类型不是线程安全类,结果是完全不可预测的。

正确的实现应该防止对同一个XDocument的并行访问(i…(在访问操作周围使用lock),只要访问是序列化的,您可以从任何线程更改它。