如何完成所有任务

时间:2017-05-09 12:24:16

标签: c# foreach enumerable enumerator

如何在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 个答案:

答案 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);
}