多次调用同一方法异步

时间:2014-04-01 16:46:41

标签: c# asp.net-mvc asynchronous

我正在构建一个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所需的时间并执行加载(这显然需要花费最多的时间)。

有没有一种简单的方法可以做到这一点而不会占用资源?如果是这样,它应该如何构建。如果需要更多信息,请告诉我。

1 个答案:

答案 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文件进行多线程解析的人。这确实不是那么简单,因为它是一个分层数据结构