Linq Task.WhenAll什么时候枚举?

Linq Task.WhenAll什么时候枚举?,linq,asynchronous,task,Linq,Asynchronous,Task,我对异步编程相当陌生。在等待任何一个任务之前,我想启动一系列任务(发出http请求) List<Guid> identifiers; //Set identifiers to what they should be var task = Task.WhenAll(identifiers.Select(id => _serviceConnector.GetAsync(id))); // Call and await another request await task;

我对异步编程相当陌生。在等待任何一个任务之前,我想启动一系列任务(发出http请求)

List<Guid> identifiers;

//Set identifiers to what they should be

var task = Task.WhenAll(identifiers.Select(id => _serviceConnector.GetAsync(id)));

// Call and await another request

await task;
列出标识符;
//将标识符设置为它们应该是什么
var task=task.WhenAll(标识符.Select(id=>_serviceConnector.GetAsync(id));
//打电话等待另一个请求
等待任务;

我的问题是:通过task.WhenAll创建任务是否会启动http请求?还是要等到下一步才开始?谢谢

whalll
立即(同步)具体化其可枚举参数。因此,所有任务都将在所有返回时启动


如果你仔细想想,这是有道理的<代码>当所有必须知道它正在等待多少任务,以便知道自己的任务何时完成。此外,它必须链接到这些任务中的每一个,以便在每个子任务完成时通知它。没有其他时间做这项工作;在返回之前,它必须计数并设置通知。

当所有
立即(同步)具体化其可枚举参数时。因此,所有任务都将在所有返回时启动

如果你仔细想想,这是有道理的<代码>当所有必须知道它正在等待多少任务,以便知道自己的任务何时完成。此外,它必须链接到这些任务中的每一个,以便在每个子任务完成时通知它。没有其他时间做这项工作;它必须计数并设置通知,然后才能返回

我的http请求会随着任务的创建而启动吗 通过任务。什么时候?还是要等到下一步才开始

当您将
IEnumerable
传递给
任务时。当所有
都枚举任务序列并将它们全部放入列表以供进一步处理时:

if (tasks == null) throw new ArgumentNullException("tasks");
List<Task<TResult>> taskList = new List<Task<TResult>>();
foreach (Task<TResult> task in tasks)
{
    if (task == null) throw new ArgumentException("tasks");
    taskList.Add(task);
}
但这并不意味着
任务。当所有的
启动这些任务时。例如,如果查询将返回尚未启动的任务,则这些任务将保持非运行状态。例如,以下查询将创建任务,但不会启动它们,因此,
whalll
将一直等待这些任务

var tasks = Enumerable.Range(1, 10).Select(i => new Task<int>(() => i));
var task = Task.WhenAll(tasks);
如您所见,此任务实现了
ITaskCompletionAction
。这是一个内部接口,用于将完成操作添加到任务中—延续任务的轻量级版本(因为它是一个简单的操作)。此接口定义单个方法
Invoke(Task)
,当任务完成执行时应调用该方法<代码>任务
有一个内部方法,允许添加这些轻量级延续:

internal void AddCompletionAction(ITaskCompletionAction action)
现在回到
WhenAllPromise
类。它有两个字段:

private readonly Task<T>[] m_tasks;
private int m_count;
就这样。任务不是由
whallpromise
类启动的。它只使用在任务完成时调用的回调操作。在回调操作中,每次完成一些任务时,它都会减少m_计数,直到所有任务都完成并且我们可以获取结果

我的http请求会随着任务的创建而启动吗 通过任务。什么时候?还是要等到下一步才开始

当您将
IEnumerable
传递给
任务时。当所有
都枚举任务序列并将它们全部放入列表以供进一步处理时:

if (tasks == null) throw new ArgumentNullException("tasks");
List<Task<TResult>> taskList = new List<Task<TResult>>();
foreach (Task<TResult> task in tasks)
{
    if (task == null) throw new ArgumentException("tasks");
    taskList.Add(task);
}
但这并不意味着
任务。当所有的
启动这些任务时。例如,如果查询将返回尚未启动的任务,则这些任务将保持非运行状态。例如,以下查询将创建任务,但不会启动它们,因此,
whalll
将一直等待这些任务

var tasks = Enumerable.Range(1, 10).Select(i => new Task<int>(() => i));
var task = Task.WhenAll(tasks);
如您所见,此任务实现了
ITaskCompletionAction
。这是一个内部接口,用于将完成操作添加到任务中—延续任务的轻量级版本(因为它是一个简单的操作)。此接口定义单个方法
Invoke(Task)
,当任务完成执行时应调用该方法<代码>任务
有一个内部方法,允许添加这些轻量级延续:

internal void AddCompletionAction(ITaskCompletionAction action)
现在回到
WhenAllPromise
类。它有两个字段:

private readonly Task<T>[] m_tasks;
private int m_count;

就这样。任务不是由
whallpromise
类启动的。它只使用在任务完成时调用的回调操作。在回调操作中,每次完成一些任务时,它都会减少m_计数,直到所有任务都完成,我们可以获取结果。

但是为什么
所有的
都不能迭代并等待每个任务呢?@SerG:我想它可以,但它最终可能会像“异步foreach”一样运行如果可枚举项按其枚举方式创建任务,那么为什么
whalll
不能迭代并等待每个任务呢?@SerG:我想它可以,但如果可枚举项按其枚举方式创建任务,那么它最终可能会像“async foreach”一样运行。