我有一个 Web API 方法,它接受字符串列表,对每个字符串执行 Web 请求,并将所有数据编译到一个列表中以供返回。
输入列表的长度可以是可变的,最多可达数千。我是否需要通过将并发任务分组来手动限制并发任务的数量,或者创建数千个任务并使用 Task.WhenAll()
等待它们是否安全?这是我现在使用的一个片段:
public async Task<List<Customer>> GetDashboard(List<string> customerIds)
{
HttpClient client = new HttpClient();
var tasks = new List<Task>();
var customers = new List<Customer>();
foreach (var customerId in customerIds)
{
string customerIdCopy = customerId;
tasks.Add(client.GetStringAsync("http://testurl.com/" + customerId)
.ContinueWith(t => {
customers.Add(new Customer { Id = customerIdCopy, Data = t.Result });
}));
}
await Task.WhenAll(tasks);
return customers;
}
最佳答案
HttpClient
可以有效地执行并发请求,但需要注意的是它限制了单个服务器的并发请求数量。
如果您的请求全部发送到同一个站点,则多余的请求将被放入队列中。当请求在此队列中时,请求超时会逐渐减少......在尝试连接到服务器之前。因此,请小心管理,如果合适的话甚至可以关闭超时。
除此之外,一次发起数千个请求也是完全可以的。
如果您认为这会影响您,可以使用 SemaphoreSlim
或 TPL 数据流来限制并发请求的数量。
关于c# - 创建数千个 Web 请求任务并使用 Task.WhenAll() 等待它们是否安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45461244/