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 внутри цикла?

Заранее благодарен за информативный ответ!
  • Вопрос задан
  • 449 просмотров
Решения вопроса 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.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы