【发布时间】:2017-10-07 18:17:30
【问题描述】:
我如何获得一个用于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(????)
}
}
【问题讨论】:
-
Task.WaitAll(customList.Select(c => c.task).ToArray());? -
为什么要将任务存储在类中? Task 不是线程,它代表一个执行。如果您想从任务列表中获取结果,只需使用
var results=await Task.WhenAll(myListOfTasks);。它也无法识别,因此没有理由使用自定义类来“包装”它 -
@juharr task.waitall 阻塞调用 where task.whenAll 主要不是这个区别
-
换句话说,正如人们在您之前的问题中已经回答的那样,停止尝试将任务当作线程来使用,或者好像它们需要某种抽象。他们没有。您可以使用带有
var tasks=myUrls.Select(url=>client.GetStringAsync(url));var contents=await Task.WhenAll(tasks)的单个客户端从 url 列表中获取结果。您可以将 URL 与结果或检查与var tasks=myUrls.Select(url=>{var response=client.GetStringAsync(url);return new {Url=url;Response=response};)结合起来 -
@ColinM OP 在今天的上一个问题中将任务与 Parallel.ForEach 和 async 混淆了。 OP 正在询问如何从多个 URL 并行检索内容
标签: c# foreach enumerable enumerator