我正在开发一个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
});
}
感谢
答案 0 :(得分:1)
Parallel.ForEach
为迭代集合提供了便利。
尽管可以在循环内调用Task.Factory.StartNew
,但它没有内在的东西表明它将在循环中使用。你可能只是开始一项任务。
由于Parallel.ForEach
假设 set 并行操作,因此它为您提供ParallelOptions
,允许您指定该一个循环范围内的并发操作数。这很有用,因为在某些情况下我们可能不关心有多少并发操作,但在其他情况下我们可能会这样做。请查看this answer,其中介绍了如何使用Semaphore
来限制并发任务的数量。设置MaxDegreeOfParallelism
要比使用Semaphore
容易得多。
此外,Parallel.ForEach
会返回ParallelLoopResult
,让您可以看到循环中的所有操作。要在一系列任务中获得相同的可见性,还需要做更多的工作。您也可以通过一次方法调用来停止循环,而不是停止多个任务。