Как ждать, пока все задачи включают в себя task.factory - PullRequest
0 голосов
/ 30 апреля 2020
private async Task StartRequesting()
{
   for (int i = 0; i < 50; i++)
   {
      await Task.Factory.StartNew(async () =>
      {
          string Result =  await GetAsync("www.google.com");
          Console.WriteLine(Result);
     });
   }
}

Console.WriteLine("Starting Request");

await StartRequesting();

Console.WriteLine("Requesting has been finished");

Как теперь ждать, когда все задание выполнено? Я попробовал Task.WhenAll, но Result в таком случае выглядит следующим образом:

Starting Request
(google result)
(google result)
(google result)
Requesting has been finished
(google result)
(google result) 

Примечание : я не хочу использовать его без Task.Factory.StartNew, потому что тогда потребуется слишком много времени, чтобы выполнить весь запрос.

Ответы [ 2 ]

3 голосов
/ 30 апреля 2020

Я всегда нахожу, что самый чистый способ сделать это - через LINQ, при условии, что нет ограничений на количество одновременных запросов:

private async Task StartRequesting()
{
    var tasks = Enumerable.Range(1, 50)
        .Select(async _ =>
        {
            string Result = await GetAsync("www.google.com");
            Console.WriteLine(Result);
        });

    await Task.WhenAll(tasks);
}

Не происходит никаких блокировок и не нужно создавать задачи вручную.

0 голосов
/ 30 апреля 2020

Было бы проще, чище и эффективнее бросить все задачи в список и получить результаты после того, как все будет сделано.

 private async Task StartRequesting()
        {
            var taskList = new List<Task<string>>();

            for (var i = 0; i < 50; i++)
                taskList.Add(Task.Run(async () => await GetAsync("www.google.com")));

            var tWhenAll = await Task.WhenAll(taskList.ToArray());

            foreach(var t in taskList)
                Console.WriteLine(t.Result);
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...