2015-09-25 24 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圍繞訪問操作),只要訪問是序列化的,您可以從任何線程更改它。