ryc*_*ell 2 .net c# asynchronous async-await
我有一个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;
}
Run Code Online (Sandbox Code Playgroud)
HttpClient 可以有效地执行并发请求,但需要注意的是它限制了对单个服务器的并发请求数.
如果您的请求都发送到同一站点,则多余的请求将被放入队列中.当请求在此队列中时,请求超时将在它尝试连接到服务器之前进行滴答.所以,仔细管理,如果合适,甚至可以关闭超时.
除此之外,一次发出数千个请求是完全可以的.
如果您认为这会对您产生影响,您可以使用SemaphoreSlim或者使用TPL数据流来限制并发请求的数量.