Я использую метод DownloadFileAsyncTask
для загрузки файлов. Однако, когда я выполняю его в цикле, я получаю исключение, которое говорит мне, что параллельные операции не поддерживаются. Я попытался исправить это следующим образом:Как заставить WebClient ждать, пока предыдущая загрузка не будет завершена?
public async Task<string> Download(string uri, string path)
{
if (uri == null) return;
//manually wait for previous task to complete
while (Client.IsBusy)
{
await Task.Delay(10);
}
await Client.DownloadFileTaskAsync(new Uri(absoluteUri), path);
return path;
}
Иногда это работает, когда число итераций не является большим (1-5), и, когда он работает в 10 или более раз я получаю эту ошибку. Client
вот WebClient
, и я создаю его один раз. Я не создаю новых клиентов на каждой итерации, потому что это накладные расходы. Назад к тому, что я говорил, как сделать WebClient
ждать до того, как предыдущая загрузка заканчивается? Также возникает вопрос, почему IsBusy
работает для небольшого количества загрузок. код я использую:
public IEnumerable<Task<string>> GetPathById(IEnumerable<Photo> photos)
{
return photos?.Select(
async photo =>
{
var path = await Download(Uri, Path);
return path;
});
}
Я хочу скачать много файлов и не блокируют мой Ui нить. Может быть, есть и другой способ сделать это?
Почему вы выполняете множество загрузок в одно и то же время в первую очередь, если вы только когда-либо сделаете так, чтобы каждый из них подождал, пока никто не будет работать, прежде чем они действительно сделают свою работу? Если вы хотите загружать только по одному, то не начинайте больше одного раза за раз; только звезда следующая, когда предыдущий заканчивается. – Servy
. Я не создаю новых клиентов на каждой итерации, потому что это накладные расходы. -> Это действительно накладные расходы? – MistyK
@ Zbigniew Ну, это разница между выполнением различных загрузок параллельно и последовательно. Это значительно увеличит плотность сетевой нагрузки. Если вы действительно захотите (или сможете) выполнять параллельные операции, конечно, будет зависеть от ситуации. – Servy