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?
来自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
),只要访问是序列化的,您可以从任何线程更改它。