在重新同步之后异步下载文件

时间:2016-08-27 19:44:04

标签: c# asynchronous

我尝试使用来自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);
        }
    }

1 个答案:

答案 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

相关问题