Вы закрываете переменную цикла во втором случае - попробуйте это:
foreach (Photo p in photos)
{
Photo photo = p;
Task.Factory.StartNew(() =>
{
WebClient webClient = new WebClient();
webClient.DownloadFile(photo.src_big, "C:\\pic" + photo.ID + ".jpg");
});
}
Также Parallel.ForEach()
является синхронным - после выполнения все файлы были загружены. Задачи, с другой стороны, все еще могут выполняться, поэтому вам придется ждать, пока они завершатся, возможно, что-то подобное будет более подходящим для второго случая:
var tasks = photos.Select( p => Task.Factory.StartNew(() =>
{
using(WebClient webClient = new WebClient())
webClient.DownloadFile(p.src_big, string.Format(@"C:\pic{0}.jpg",p.ID));
})).ToArray();
Task.WaitAll(tasks);
Как видите, Parallel.ForEach()
в этом случае гораздо предпочтительнее, поскольку синтаксис очень лаконичен, под капотом они оба используют Пул потоков, поэтому выберите самый простой вариант, с которым вы можете обойтись, особенно если вы этого не делаете. нужна дополнительная сложность.
Также я не думаю, что вы будете получать свои данные быстрее, используя WebRequest
- большая часть задержки будет вызвана сетью / интернетом, а не тем, какой из двух вы выберете - в таком случае я бы выберите более простой код, который определенно использует WebClient
.
Подводя итог: я бы пошел на Parallel.ForEach()
с WebClient
, опция 1 .