【发布时间】:2018-10-30 15:35:52
【问题描述】:
我正在调用一个很慢的外部 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);
}
}
这是我上面代码的摘要... getOrders.Execute() 是 api 触发的时间。
在第一个“getOrders.Execute()”之后有一个分页结果,它告诉我有多少页数据。我的想法是我应该能够为每个页面启动异步调用并填充 OrderTypeCollection。当所有调用都完成并且集合完全加载后,我将提交到数据库。
我以前从未通过 c# 进行过异步调用,我可以遵循 Async await,但我认为我的场景超出了我目前所做的阅读范围?
问题:
- 我想我可以将其设置为异步触发多个调用,但我不确定如何检查所有任务何时完成,即准备好提交到 db。
- 我在某处读到过,我希望避免将 API 调用和 db 写入结合起来以避免锁定 SQL Server - 这是正确的吗?
如果有人能指出我正确的方向 - 将不胜感激。
【问题讨论】:
-
欢迎使用 ebay api ;) 慢
-
问题不在于异步执行(这不会使其更快),而是并行调用。正如 TheGeneral 所说,ebay 无论如何都没有异步支持。因此,您可以启动 x 个线程,每个线程每页执行一个同步调用。只是不要产生 20 个线程。产生 = CPU 计数。或者您可能想看看 TPL DataFlow。更好的长期投资。
-
@MickyD 是的,抱歉,我的术语可能不正确。我正在寻找并行进行这些调用。我正在调查将军的回答
-
不用担心。我同意将军的回答:)
标签: c# async-await