我尝试使用来自MSDN的提示并从此处异步下载某些文件,但我的尝试通常以死机或错误导致的错误结束而不等待下载结束。下面我粘贴了不起作用的示例代码,但希望能解释我的意图。我将非常感谢你的帮助。
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);
}
}
答案 0 :(得分:1)
使用test.Wait();
阻止了异步方法
使用async
的最佳做法是在整个方法中使用await
。 请勿混淆阻止和异步代码。
public async Task SomeMethod() {
// Determine which files to download
List<FileRequest> fileRequests = Determine();
//this will allow the down load to not lock the ui
await DownloadFilesAsync(fileRequests);
// 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);
}
}
来源 - Async/Await - Best Practices in Asynchronous Programming