我正在构建一个MVC应用程序,该应用程序循环遍历包含一些Urls的XML文档,并且可以反对这些URL。该文档最多可包含400多个Url,因此一次获取一个Url对用户来说是一个相当大的延迟,因此我希望并行执行这些操作。
以下是执行我想重构的工作的方法的基本结构
List<CustomObject> finalList = new List<CustomObject>();
// at this point, list is populated with urls
foreach (string url in list)
{
XmlReader reader = XmlReader.Create(url);
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(reader);
//below method processes the XML and adds it to the List of custom objects
finalList.AddRange(ProcessXML(xmlDoc));
}
基本上,我想要做的是启动几个线程以减少循环Doc所需的时间并执行加载(这显然需要花费最多的时间)。
有没有一种简单的方法可以做到这一点而不会占用资源?如果是这样,它应该如何构建。如果需要更多信息,请告诉我。
答案 0 :(得分:1)
class WorkItem
{
public string Uri { get; set; }
public byte[] Data { get; set; }
}
var items = new List<WorkItem>();
// first do the parsing as you parsing
foreach (var urlFound in yourXmlDoc)
{
items.Add(new WorkItem{Uri = url});
}
// then the actual work itself
Parallel.ForEach(items, item => {
item.Data = GetUrlData(item.Uri);
});
这是做什么的:
首先从XML文档中获取所有URL,这是您必须自己完成的,因为您没有提供任何有关此信息的信息
对于找到的每个URL,将创建一个WorkItem实例,其中包含实际的URL / URI并添加到列表中
然后,使用Parallel.ForEach()完成工作。看一下匿名方法:GetUrlData(),你也实现了这个方法。返回类型是字节数组或其他
这样做的好处是,您不必担心同步对列表的访问
BTW:
我从未见过一个对XML文件进行多线程解析的人。这确实不是那么简单,因为它是一个分层数据结构