Linq Task.WhenAll什么时候枚举?
我对异步编程相当陌生。在等待任何一个任务之前,我想启动一系列任务(发出http请求)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;
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”一样运行。