Я попытался загрузить асинхронно определенные файлы, используя советы от MSDN и отсюда, но мои попытки обычно заканчиваются тупиком или ошибками, вызванными применением, не дожидаясь конца загрузки. Ниже я вставил образец кода, который не работает, но, надеюсь, объясняет мои намерения. Буду признателен за вашу помощь.Загрузите файлы асинхронно, после этого resync
public void SomeMethod() // which must be called synchronously
{
// Determine which files to download
List<FileRequest> fileRequests = Determine();
var test = DownloadFilesAsync(fileRequests);
test.Wait();
// After that do something else with downloaded files synchronously
}
public async Task DownloadFilesAsync(List<FileRequest> fileRequests)
{
await Task.WhenAll(fileRequests.Select(fileRequest =>
DownloadFileAsync(fileRequest))).ConfigureAwait(false);
}
public async Task DownloadFileAsync(FileRequest fileRequest)
{
using (WebClient client = new WebClient())
{
await client.DownloadFileTaskAsync(fileRequest.url,fileRequest.downloadPath).ConfigureAwait(false);
}
}
Вы смешиваете синхронные и асинхронные, которые, как правило, приводят к тупикам. Является ли 'SomeMethod()' обработчиком событий? – Nkosi
No SomeMethod() не является обработчиком событий и не относится к элементу пользовательского интерфейса (ожидая этого в качестве последующего вопроса). – Tei444
Если этот код запущен в контексте SynchronizationContext, который использует насос сообщений Windows, чтобы выполнить свою магию, тогда он будет блокирован. Вы никогда не должны смешивать async/await с кодом блокировки. –