2014-04-01 27 views
1

我正在构建一个MVC应用程序,该应用程序通过包含一些Url的XML文档进行循环,并针对这些URL执行操作。该文档可以包含多达400个以上的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)); 
} 

基本上,我想要做的就是旋转了一个线程数来减少所需的时间量循环通过文件并执行加载(这显然需要最多的时间)。

有没有简单的方法来做到这一点,不会吃掉资源?如果是这样,它应该如何构建。让我知道是否需要更多信息。

+1

你的问题是广泛的很难得到什么花费大部分时间的foreach或URL我得不到foreach异步和异步在foreach给你一个很大的失败 –

+0

有趣的想法,旋转线程不会困难,但我很好奇你的想法,多个线程循环通过相同的文件。那会在你的结果列表中产生重复的结果呢?如果您同时解析不同的文档,通常会使用多个线程,而不是多个线程解析一个文档。 – mituw16

+0

http://stackoverflow.com/q/5114554/2563028 – EfrainReyes

回答

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); 
     }); 

这样做是:
首先获得所有URL从XML文档,这你必须做你自己,你没有提供有关这方面的消息。
对于找到的每个URL,都将创建一个WorkItem实例,其中包含实际的URL/URI并添加到列表中。
然后,使用Parallel.ForEach()完成工作。看一下匿名方法:GetUrlData(),你也实现了这个方法。返回类型将是一个字节数组或其他。
这样做的好处是,你不必担心同步到列表

BTW访问:
我从来没有看到一个谁做一个XML文件的多线程解析。这确实不是那么简单,因为它是一个分层的数据结构