c# - 以非常好的性能并行/顺序执行 httpclient 调用且不丢失数据的最佳实践是什么
问题描述
我们需要执行批量 API 请求(超过 1000 次调用)并将响应数据保存在数据库中。
最初我们有 10-20 个 API 调用要求。对于这些请求,我们使用带有单个 HTTPClient 实例的简单“for 循环”来获取数据并将其保存到数据库中。
后来我们得到了 100-200 个 API 调用要求。对于这些请求,我们使用 Parallel.ForEach 和单个 HTTPClient 实例,但我们遇到了套接字问题。所以我们为每个请求创建了新实例。即使这种方法在服务器上引起问题。
现在的要求是执行 1000 多个 API 调用。
使用“等待”的单个 HTTPClient 实例需要数小时才能完成操作。
有没有什么方法或好的做法可以进行 1000+ api 调用,性能非常好,并且不会丢失 C# 中的数据?
解决方案
您可以尝试将评论中的解决方案与 when all 结合使用:https ://docs.microsoft.com/en-us/dotnet/api/system.threading.tasks.task.whenall?view=net-5.0
private static HttpClient Client = new HttpClient();
public static async Task Main(string[] args)
{
var tasks = new List<Task>();
Console.WriteLine("Starting connections");
for(int i = 0; i<10; i++)
{
tasks.Add(Client.GetAsync("http://aspnetmonsters.com"))
Console.WriteLine(result.StatusCode);
}
Task t = Task.WhenAll(tasks);
try {
t.Wait();
}
catch {}
Console.WriteLine("Connections done");
Console.ReadLine();
}
推荐阅读
- javascript - 在 Firebase 云函数中批量处理 Promise
- java - 出于某种原因,共享首选项默认为 true
- scala - 如何在 Intellij 的 Scala 中运行 Main 方法
- c# - 如何从另一个程序集将 DBContext 添加到服务
- c# - EF Core 数据为空
- c - 如何在 $PATH 中添加和删除名称?
- sql - Oracle:当一列中的值更改时选择行
- c - 使用 fwrite() 在 C 中使用 unsigned short 将二进制文件写入文件
- javascript - Javascript - if(...) 在 Firefox 和 Safari 中的评估不同
- javascript - 如何将具有多种状态的组件转换为反应功能