使用Task.WhenAll()创建数千个Web请求任务并等待它们是否安全

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)

Cor*_*son 6

HttpClient 可以有效地执行并发请求,但需要注意的是它限制了对单个服务器的并发请求数.

如果您的请求都发送到同一站点,则多余的请求将被放入队列中.当请求在此队列中时,请求超时将在它尝试连接到服务器之前进行滴答.所以,仔细管理,如果合适,甚至可以关闭超时.

除此之外,一次发出数千个请求是完全可以的.

如果您认为这会对您产生影响,您可以使用SemaphoreSlim或者使用TPL数据流来限制并发请求的数量.