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

标签 c# .net 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;
}

最佳答案

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

如果您的请求全部发送到同一个站点,则多余的请求将被放入队列中。当请求在此队列中时,请求超时会逐渐减少......在尝试连接到服务器之前。因此,请小心管理,如果合适的话甚至可以关闭超时。

除此之外,一次发起数千个请求也是完全可以的。

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

关于c# - 创建数千个 Web 请求任务并使用 Task.WhenAll() 等待它们是否安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45461244/

相关文章:

c# - 动态控制 C# 上的验证器噩梦

c# - 如何在.net core 的库中包含文件

c# - 结构中指针字段的大小

c# - 统一配置约定

c# - 在同一 HTTP 请求 ASP.NET Core C# 中混合异步和同步

c# - 如何创建 Async ActionResult 以创建用于以下轮询逻辑的 async-await 模式?

.net - 循环遍历 LINQ 数据的更快方法

c# - 支持aspx页面中的OPTIONS请求头

javascript - AngularJS中包含内部操作的同时异步请求