如何在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(????)
}
}
答案 0 :(得分:2)
任务不是线程。它们代表函数的 execution ,因此将它们及其结果存储为类是没有意义的。如果您使用Task.WhenAll
,则可以轻松获得多个任务的结果。
没有理由将任务包装在一个类中。您可以将 Task 本身视为线程调用的包装器,并且是结果。
如果要从多个页面检索内容,可以使用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
lambda中执行此操作:
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);
}