使用Parallel的主要区别是什么?ForEach,Task.Factory.StartNew

本文关键字:ForEach Task Factory StartNew 是什么 Parallel 区别 使用 | 更新日期: 2023-09-27 17:53:04

我正在做一个asp.net mvc-4 web应用程序。但我不确定使用这两种方法迭代列表和启动WebClient()调用之间的差异:-

方法1

Parallel.ForEach(photos,new ParallelOptions { MaxDegreeOfParallelism = 7 }, p =>
                            {
         ResourceAccountListInfo resourceAccountListInfo = new ResourceAccountListInfo();
         WebClient wc = new WebClient();               
         var json =  wc.DownloadString(p.url);
         resourceAccountListInfo = JsonConvert.DeserializeObject<ResourceAccountListInfo>(json);
         if (resourceAccountListInfo.operation.Details.CUSTOMFIELD.Count > 0)
                    {
                        List<CUSTOMFIELD> customfield = resourceAccountListInfo.operation.Details.CUSTOMFIELD.Where(a =>
                                 a.CUSTOMFIELDLABEL.ToLower() == "name"
                                ).ToList();
                        if (customfield.Count == 1)
                        {
                            PMresourcesOnly.Add(resourceAccountListInfo.operation.Details);
                        }
                    }
            //code goes here
                            });

方法2

   foreach (Photo p in photos)
                        {
            Task.Factory.StartNew(() =>
                        {
            ResourceAccountListInfo resourceAccountListInfo = new ResourceAccountListInfo();
            WebClient wc = new WebClient();
            var json =  wc.DownloadString(p.url);
            resourceAccountListInfo = JsonConvert.DeserializeObject<ResourceAccountListInfo>(json);
                     if (resourceAccountListInfo.operation.Details.CUSTOMFIELD.Count > 0)
                    {
                        List<CUSTOMFIELD> customfield = resourceAccountListInfo.operation.Details.CUSTOMFIELD.Where(a =>
                                 a.CUSTOMFIELDLABEL.ToLower() == "name"
                                ).ToList();
                        if (customfield.Count == 1)
                        {
                            PMresourcesOnly.Add(resourceAccountListInfo.operation.Details);
                        }
                    }
            //code goes here
                                });
                        }

谢谢

使用Parallel的主要区别是什么?ForEach,Task.Factory.StartNew

Parallel.ForEach为遍历集合提供了方便。尽管Task.Factory.StartNew可以在循环中调用,但是没有任何内在的东西表明它将在循环中使用。你可以只开始一个任务。

因为Parallel.ForEach假定了并行操作的集合,所以它为您提供了ParallelOptions,允许您指定在该循环范围内并发操作的数量。这很有用,因为在某些情况下,我们可能不关心有多少并发操作,但在其他情况下,我们可能会。看看这个答案,它描述了使用Semaphore来限制并发任务的数量。设置MaxDegreeOfParallelism比使用Semaphore容易得多。

另外,Parallel.ForEach返回一个ParallelLoopResult,它使您可以看到循环中的所有操作。要在任务集合中获得相同的可见性,需要做更多的工作。您还可以通过调用一个方法来停止循环,而不是停止多个任务。