Как получить все задачи в
Как я могу получить итератор для использования в 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);
}