C# Async/Task/Await:Await实际上并不等待

C# Async/Task/Await:Await实际上并不等待,c#,asynchronous,async-await,task,webclient,C#,Asynchronous,Async Await,Task,Webclient,我正在实现一种方法,以便依次下载多个文件 我希望该方法是异步的,这样就不会阻塞UI 这是一种下载单个文件并将下载任务返回给上级方法的方法,上级方法下载所有文件(再往下) 在这里,我只是从FilesToDownload中的所有文件创建一个IEnumerable public async void DownloadFiles() { // Angeben, dass der Download nun aktiv ist / Show active bindin

我正在实现一种方法,以便依次下载多个文件

我希望该方法是异步的,这样就不会阻塞UI

这是一种下载单个文件并将下载任务返回给上级方法的方法,上级方法下载所有文件(再往下)

在这里,我只是从FilesToDownload中的所有文件创建一个
IEnumerable

public async void DownloadFiles()
        {
            // Angeben, dass der Download nun aktiv ist / Show active binding
            Active = true;
            // Den Fortschritt zurücksetzen / Set Progress to 0 (restarting download)
            Progress = 0;
            // Die bereits heruntergeladenen Dateien schließen. / Clear Downloads
            DownloadedFiles.Clear();
            // Alle Downloads starten und auf jeden einzelnen warten
            await Task.WhenAll(FilesToDownload.Select(file => DownloadFromRepo(file)));
        }
最后,我想这样调用该方法:

private void RetrieveUpdate()
        {
            UpdateInformationDownload.DownloadFiles();
            AnalyzeFile();
        }
问题是,
RetrieveUpdate()
方法跳过
AnalyzeFile()
,然后尝试访问当前正在下载的文件

需要我希望能够调用
UpdateInformationDownload.DownloadFiles()
,等待它完成(也就是说,它下载了所有文件),然后继续与
AnalyzeFile()同步


我怎样才能做到这一点?我已经在互联网上查找了大量资源,找到了一些解释和Microsoft文档,但我认为我没有逐步了解使用async/await的方案。

简单:
await
it

 public aysnc Task DownloadFromRepo(String fileName)
 {
    ...
    using (WebClient FileClient = new WebClient())
    {
        ...
        await FileClient.DownloadFileTaskAsync(new System.Uri(RepoDir + fileName), 
curFilePath);
    }
}
如果没有
wait
,实际上,
Dispose()
会立即发生

我相信roslynator现在会自动检测到这种情况并警告您(并且有一个自动修复程序可用)——非常值得安装

同样地:

private async Task RetrieveUpdate()
{
    await UpdateInformationDownload.DownloadFiles();
    AnalyzeFile();
}
以及:


您需要
public async Task DownloadFiles
如果我这样做,我将始终必须以异步方法调用
RetrieveUpdate()
?“我怎么用普通的方法来称呼它?”莱昂博曼,理想情况下你不会。使整个调用堆栈异步
private async Task RetrieveUpdate()
{
    await UpdateInformationDownload.DownloadFiles();
    AnalyzeFile();
}
public async Task DownloadFiles() {...}