使用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
假定了并行操作的集合,所以它为您提供了ParallelOptions
,允许您指定在该循环范围内并发操作的数量。这很有用,因为在某些情况下,我们可能不关心有多少并发操作,但在其他情况下,我们可能会。看看这个答案,它描述了使用Semaphore
来限制并发任务的数量。设置MaxDegreeOfParallelism
比使用Semaphore
容易得多。
另外,Parallel.ForEach
返回一个ParallelLoopResult
,它使您可以看到循环中的所有操作。要在任务集合中获得相同的可见性,需要做更多的工作。您还可以通过调用一个方法来停止循环,而不是停止多个任务。