Как получить все задачи в

Как я могу получить итератор для использования в Task.WaitAll ждать, пока все задачи существуют в customList с наименьшими накладными расходами или строк кода?

   public class Custom
    {
      public Task task;
      public  int result;
    }

public class Main
    {
       void doSomething()
       {
           List<Custom> customList=new List<>();
           //customList.Add(custom1,2,3,4,5.....);
           Task.WaitAll(????)
       }
    }

1 ответ

Задачи не являются потоками. Они представляют выполнение функции, поэтому нет смысла хранить их и их результаты в виде классов. Получить результаты нескольких задач очень легко, если вы используете Task.WhenAll,

Нет смысла переносить задачу в классе. Вы можете думать о самой Задаче как обертке над вызовом потока, и это результат.

Если вы хотите получить содержимое с нескольких страниц, вы можете использовать LINQ для одного HttpClient, чтобы запрашивать содержимое с нескольких страниц одновременно. await Task.WhenAll вернет результаты всех задач:

string[] myUrls=...;
HttpClient client=new HttpClient();
var tasks=myUrls.Select(url=>client.GetStringAsync(url));
string[] pages=await Task.WhenAll(tasks);

Если вы хотите вернуть больше данных, например, проверить содержимое, вы можете сделать это внутри Select лямбда:

var tasks=myUrls.Select(async url=>
          {
              var response=await client.GetStringAsync(url);
              return new {        
                          Url=url,
                          IsSensitive=response.Contains("sensitive"),
                          Response=response
                         };
          });
var results =await Task.WhenAll(tasks);

Результаты содержат анонимные объекты, созданные внутри Select, Вы можете перебирать или запрашивать их, как и любой другой массив, например:

foreach(var result in results)
{
    Console.WriteLine(result.Url);
}
Другие вопросы по тегам