littleguga
@littleguga
Не стыдно не знать, а стыдно не интересоваться.

Как правильно организовать многопоточное/асинхронное скачивание?

Качаю через WebClient. Как правильнее и быстрее будет:

1 способ:
spoiler
Task.Factory.StartNew(() =>
{
	myload(max_id);
}).ContinueWith((t) => {
	result.Text = "saved!";
	result.ForeColor = System.Drawing.Color.Green;

}, TaskScheduler.FromCurrentSynchronizationContext());

private void myload(int max_id)
{
	int i = 1;
	while(i <= max_id)
	{
		filename = path_tosave + "/" + i + ".png";
		loadurl = lurl + i + ".png";
		WebClient webClient = new WebClient();
		webClient.DownloadFileCompleted += download_completed;
		webClient.DownloadFileAsync(new Uri(loadurl), filename);
		i++;
	}
}


Или отдельно для каждого файла создавать Task внутри цикла?

Заранее благодарен за информативный ответ!
  • Вопрос задан
  • 451 просмотр
Решения вопроса 1
dasha_programmist
@dasha_programmist
ex Software Engineer at Reddit TS/React/GraphQL/Go
разбиваешь множество индексов на части, например 1-100, 100-200, 200-300
в цикле 3 таски запускаешь
var tasks = new List<Task>();
for(var i=0;i<3;i++){
tasks.Add(Task.Run(()=>{
myload(from, till); // метод изменить, чтобы он индексы от и до принимал
}));
}
Task.WaitAll(tasks.ToArray());
// тут кусок кода после завершения всех
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@MonkAlex
C#, SQL, Delphi, C++ etc
Не знаю насчет правильно, но вполне успешно использую Parallel.ForEach, создавая внутри экземпляры WebClient.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы