首页 > 解决方案 > 以非常好的性能并行/顺序执行 httpclient 调用且不丢失数据的最佳实践是什么

问题描述

我们需要执行批量 API 请求(超过 1000 次调用)并将响应数据保存在数据库中。

最初我们有 10-20 个 API 调用要求。对于这些请求,我们使用带有单个 HTTPClient 实例的简单“for 循环”来获取数据并将其保存到数据库中。

后来我们得到了 100-200 个 API 调用要求。对于这些请求,我们使用 Parallel.ForEach 和单个 HTTPClient 实例,但我们遇到了套接字问题。所以我们为每个请求创建了新实例。即使这种方法在服务器上引起问题。

现在的要求是执行 1000 多个 API 调用。

使用“等待”的单个 HTTPClient 实例需要数小时才能完成操作。

有没有什么方法或好的做法可以进行 1000+ api 调用,性能非常好,并且不会丢失 C# 中的数据?

标签: c#azurehttpclient

解决方案


您可以尝试将评论中的解决方案与 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();
}

推荐阅读