2015-09-25 46 views
1

我从未在c#中尝试过并行编程。 因此,在我加入之前,我希望能够快速回答它是否值得深入研究。 我有.NET 4.0的C#WCF Web服务应用程序。 (如果并行编程可以升级到4.5)C#并行编程修改xDocument

所有的服务都是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进行并行计算吗?

+0

所以你正试图加快“ProcessDocument”完成所需的时间。你每秒或每分钟调用一次这种方法(在不同的文件上)多少次?也许不是让这个方法运行得更快,你可以在不同的文档上运行它的实例吗? –

+0

我们已经运行了许多服务实例。 我们有负载平衡器。 但是对于某些文件(大小几个千兆字节),服务有时需要5分钟 –

+0

如果你有8个CPU核心,并且你在8个不同的线程上运行8个实例,那么并行运行方法中的循环将不会赢得你的任何表演。 –

回答

3

从文档的XElement:这种类型的

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

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

另一个问题是,它不适合在相同数据上进行某种操作。

这种方式不可扩展。

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

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

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

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

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

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

这看起来不错。 我很高兴尝试它。 非常感谢 我会让你知道结果是什么。 –

0

多个线程在同一时间修改XDocument实例 - 是的,有什么明确的停止线进行更改(不像在的WinForms/WPF UI例如操作)。

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

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