C#并行编程修改xDocument

我从来没有在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进行并行计算?


来自XElement文档:

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

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

另一个问题是,在相同的数据上进行一种操作是不现实的。

这种方式不可扩展。

对于每个CPU内核而言,可能没有足够的操作类型来分支,而一种类型的操作可能会比另一种快得多。 争议也很高。

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

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

你基本上需要一个拷贝构造函数来处理每个XElement。

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

  var newCollection = new XElement("items", newElements);

是否可以同时多线程修改XDocument实例 - 是的,没有任何显式停止线程来进行更改(例如与WinForms / WPF中的UI操作不同)。

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

正确的实现应该防止并行访问相同的XDocument (即使用lock访问操作的i..e),只要访问是序列化的,您可以从任何线程更改它。

链接地址: http://www.djcxy.com/p/50157.html

上一篇: C# parallel programming modifying xDocument

下一篇: Parallel.ForEach stops being parallel for the last few items