Задача. Когда все завершается раньше всех задач - PullRequest
0 голосов
/ 30 марта 2020

Я загружаю некоторые файлы, используя asyn c Задачи и использую Task.When Все завершение, чтобы обнаружить, что все файлы были загружены. Однако, когда все завершено до загрузки всех файлов.

    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");
    }

Журнал консоли

1 Ответ

1 голос
/ 30 марта 2020

Не используйте конструктор Task, который принимает Action вместо Func<Task> в качестве аргумента. Используйте Task.Run() вместо этого, если вы действительно хотите работать в пуле потоков. Он принимает Func<Task> и должным образом ожидает завершения функции, а не выполнения в режиме «забыл и забыл», как это делает ваш конструктор.

Кроме того, старайтесь избегать вызова .GetResult(), который потенциально может вызвать тупики. Вместо этого напишите свою основную функцию так:

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