我想知道如果待完成的任务数量很大,我们是否应该对异步任务进行节流。比如你有1000个URL,你是一次性发出所有请求然后等待全部完成呢?
var tasks = urlList.Select(url => downloadAsync(url));
await Task.WhenAll(tasks);
或者你将请求分批处理,一个批次接一个批次地处理:
foreach (var urlBatch in urlList.BatchEnumerable(BatchSize)){
var tasks = urlBatch.Select(url => downloadAsync(url));
await Task.WhenAll(tasks);
}
我曾认为批处理并非必要,因为第一种方法(一次性发送所有请求)会创建由ThreadPool
调度的任务,所以我们应该让ThreadPool
决定何时执行每个任务。然而,有人告诉我,实际上这只在任务是计算任务时有效。当任务涉及网络请求时,第一种方法可能会导致主机挂起。为什么会这样?