当前位置: 首页 > 知识库问答 >
问题:

长API调用-异步调用答案?

呼延渝
2023-03-14

我正在调用一个外部API,这是缓慢的。目前,如果我已经调用API获取一些订单一段时间,调用可以分成页面(分页)。

因此,获取订单可能是进行多个调用,而不是1个调用。有时,每次呼叫可能是10秒左右,所以总共可能是一分钟左右,这太长了。

        GetOrdersCall getOrders = new GetOrdersCall();
        getOrders.DetailLevelList.Add(DetailLevelCodeType.ReturnSummary);
        getOrders.CreateTimeFrom = lastOrderDate;
        getOrders.CreateTimeTo = DateTime.Now;

        PaginationType paging = new PaginationType();
        paging.EntriesPerPage = 20;
        paging.PageNumber = 1;

        getOrders.Pagination = paging;

        getOrders.Execute();

        var response = getOrders.ApiResponse;
        OrderTypeCollection orders = new OrderTypeCollection();

        while (response != null && response.OrderArray.Count > 0)
        {
            eBayConverter.ConvertOrders(response.OrderArray, 1);

            if (response.HasMoreOrders)
            {
                getOrders.Pagination.PageNumber++;
                getOrders.Execute();

                response = getOrders.ApiResponse;
                orders.AddRange(response.OrderArray);
            }
        }
    null

如果有人能给我指明正确的方向--那将不胜感激。

共有1个答案

嵇浩然
2023-03-14

我想我可以将它设置为异步地触发多个调用,但我不确定如何检查所有任务何时已经完成,即准备提交给DB。

是的。你可以把这个拆散

问题是ebay没有异步任务执行方法,所以您只能阻止线程调用,并且没有IO优化的异步等待模式。如果有,您可以利用异步感知的TPL数据流管道(而且整个家庭玩起来很有趣),无论如何您都可以,尽管我提出了一个普通的TPL解决方案...

var concurrentBag = new ConcurrentBag<OrderType>();


// make first call
// add results to concurrentBag
// pass the pageCount to the for
int pagesize = ...;

Parallel.For(1, pagesize,
   page =>
      {
         // Set up
         // add page
         // make Call 

         foreach(var order in getOrders.ApiResponse)
            concurrentBag.Add(order);
      });

// all orders have been downloaded
// save to db

注意:您配置了MaxDegreeOfParallelism,可能将其设置为50,尽管您给它多少并不重要,但任务调度程序不会给您大量的线程,最初可能是10个左右,并且增长缓慢。

另一种方法是创建自己的任务计划程序,或者使用老式的Thread类旋转自己的线程

我在某个地方读到过,我希望避免将API调用和db写结合起来,以避免在SQL server中锁定--这是正确的吗?

    null

额外资源

用于(Int32,Int32,ParallelOptions,Action)

执行for(Visual Basic中的for)循环,在该循环中,迭代可以并行运行,并且可以配置循环选项。

表示线程安全的、无序的对象集合。

 类似资料:
  • 我有一个用c#编写的AWS lambda函数。此函数负责调用5-6个API调用(Post请求)。 所有这些API调用都是相互独立的。 我不关心这些API调用的响应。 即使我不关心后续响应,每个API调用也需要大约5秒才能完成。 问题:我希望lambda函数在一秒钟内执行并响应。如何异步进行API调用,使lambda函数能够在我的时间限制内完成所有这些操作,而不必等待API调用的响应?理想情况下,我

  • 本文向大家介绍JavaScript 异步调用,包括了JavaScript 异步调用的使用技巧和注意事项,需要的朋友参考一下 问题 可修改下面的 aa() 函数,目的是在一抄后用 console.log() 输出 want-value 但是,有额外要求: aa() 函数可以随意修改,但是不能有 console.log() 执行 console.log() 语句里不能有 setTimeout 包裹 解

  • Provider端异步执行将阻塞的业务从Dubbo内部线程池切换到业务自定义线程,避免Dubbo线程池的过度占用,有助于避免不同服务间的互相影响。异步执行无益于节省资源或提升RPC响应性能,因为如果业务执行需要阻塞,则始终还是要有线程来负责执行。 注意:Provider端异步执行和Consumer端异步调用是相互独立的,你可以任意正交组合两端配置 Consumer同步 - Provider同步 C

  • 从v2.7.0开始,Dubbo的所有异步编程接口开始以CompletableFuture为基础 基于 NIO 的非阻塞实现并行调用,客户端不需要启动多线程即可完成并行调用多个远程服务,相对多线程开销较小。 使用CompletableFuture签名的接口 需要服务提供者事先定义CompletableFuture签名的服务,具体参见服务端异步执行接口定义: public interface Asyn

  • 问题内容: 我正在尝试使用Okhttp库通过API将我的Android应用程序连接到服务器。 单击按钮就会发生我的API调用,并且我收到以下 android.os.NetworkOnMainThreadException 。我了解这是由于我正在尝试在主线程上进行网络调用,但是我也正努力在Android上寻找一种干净的解决方案,以使该代码如何使用另一个线程(异步调用)。 上面是我的代码,并且在行上抛

  • 我有一个由S3推送事件触发的AWS Lambda。lambda将调用一个API,这将触发一个长时间运行的进程。我认识到我可以配置S3异步调用lambda函数,因此S3不会等待响应,但我很想知道我是否可以配置lambda异步调用我的API。我不希望lambda在过程完成时等待几分钟。有人能给我指出一些概述这个过程的留档吗?提前谢谢。