任务。当所有任务都完成之前

时间:2020-03-30 16:27:49

标签: c# asynchronous task

我正在使用异步任务并使用Task.WhenAll完成来检测所有文件的下载文件。但是,当All全部完成之后,才下载所有文件。

    static void Main(string[] args)
    {
        DownloadFilesTasksAsync().GetAwaiter().GetResult();
    }

    static async Task DownloadFilesTasksAsync()
    {
        List<Task> tasks = new List<Task>();

        foreach(var blobName in blobNames)
        {
            Task blobDownloadTask = new Task(
                async () =>
                {
                     await new AzureStorageProvider().DownloadFileFromBlob(WebUtility.UrlDecode(blobName));
                     Console.WriteLine($"Downloaded {blobName}");                        
                }
            );

            blobDownloadTask.Start();
            tasks.Add(blobDownloadTask);
        }

        await Task.WhenAll(tasks.ToArray());

        Console.WriteLine("After When all");
    }

Console log

1 个答案:

答案 0 :(得分:1)

不要使用Task构造函数,该构造函数接受Action而不是Func<Task>作为参数。如果您确实想在线程池上运行,请改用Task.Run()。它接受Func<Task>并适当地等待函数完成,而不是像构造函数当前正在执行的那样,以一劳永逸的方式执行。

此外,请尝试避免调用.GetResult(),这可能会导致死锁。而是这样编写您的主要功能:

static async Task Main(string[] args) {
    await DownloadFilesTasksAsync();
}