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),只要访问是序列化的,您可以从任何线程更改它。
上一篇: C# parallel programming modifying xDocument
下一篇: Parallel.ForEach stops being parallel for the last few items