首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >加速多个API调用

加速多个API调用
EN

Stack Overflow用户
提问于 2021-01-17 20:45:47
回答 1查看 167关注 0票数 0

所以我在uni中做了这个项目,我正在尝试重构。我遇到的一个问题是我获取顶级列表的方法,该列表包含大约250部电影,例如250个API调用。在那之后,我把它们都呈现在我的网页上。我使用的API是OMDBAPI,正如你在下面的代码中看到的那样,我可以单独获取每一部电影。

基本上,网页做的是默认加载10部电影,但我也可以加载所有的电影,这大约是250。

我正在试着把我的大脑包裹在异步编程上。因此,根据C#中的秒表,基本上需要大约4-6秒来处理这个方法,但我相信应该可以重构和改进。我是异步编程的新手,在此之前我已经尝试过查看MSFT文档和几个问题,但我在加快调用速度方面没有取得任何进展。

我已经考虑过使用并行来解决这个问题,但我认为我的问题应该可以用异步来解决?通过C#中的秒表,我已经准确地指出延迟主要来自两个x之间。

我最希望的是加快调用速度,但我也喜欢异步编程的最佳实践技巧。

代码语言:javascript
运行
复制
public async Task<List<HomeTopListMovieDTO>> GetTopListAggregatedData(Parameter parameter)
{
    List<Task<HomeTopListMovieDTO>> tasks = new List<Task<HomeTopListMovieDTO>>();
    var toplist = await GetToplist(parameter);
//x
    foreach (var movie in toplist)
    {
        tasks.Add(GetTopListMovieDetails(movie.ImdbID));
    }
    var results = Task.WhenAll(tasks);
//x
    var tempToplist = toplist.ToArray();
    for (int i = 0; i < tasks.Count; i++)
    {
        tasks[i].Result.NumberOfLikes = tempToplist[i].NumberOfLikes;
        tasks[i].Result.NumberOfDislikes = tempToplist[i].NumberOfDislikes;
    }

    List<HomeTopListMovieDTO> toplistMovies = results.Result.ToList();

    return toplistMovies;
}
代码语言:javascript
运行
复制
public async Task<HomeTopListMovieDTO> GetTopListMovieDetails(string imdbId)
{
    string urlString = baseUrl + "i=" + imdbId + accessKey;
    return await apiWebClient.GetAsync<HomeTopListMovieDTO>(urlString);
}
代码语言:javascript
运行
复制
public async Task<T> GetAsync<T>(string urlString)
{
    using (HttpClient client = new HttpClient())
    {
        var response = await client.GetAsync(urlString,
            HttpCompletionOption.ResponseHeadersRead);
        response.EnsureSuccessStatusCode();
        var data = await response.Content.ReadAsStringAsync();
        var result = JsonConvert.DeserializeObject<T>(data);
        return result;
    }
}
EN

回答 1

Stack Overflow用户

发布于 2021-01-17 21:33:45

你的异步代码看起来像OKey。我会限制使用分区程序/ parallel for each不超过X个并行请求,但使用WaitAll也足够好,除非您看到连接因端口耗尽或API DDOS保护而被拒绝。

您应该重用HttpClient,在https://www.aspnetmonsters.com/2016/08/2016-08-27-httpclientwrong中查看更多细节,因此在您的示例中,在根方法中创建HttpClient,并将其作为参数传递给异步方法。HttpClient是线程安全的,可以在并行调用中使用。

您应该处理HttpResponse。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65760737

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档