gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 15:53:07 24 4
gpt4 key购买 nike

我正在调用一个速度很慢的外部 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 进行操作,但我认为我的场景不符合我目前所读的内容?

问题:

  1. 我想我可以将其设置为异步触发多个调用,但我不确定如何检查所有任务何时完成,即准备好提交给数据库。
  2. 我在某处读到我想避免组合 API 调用和数据库写入以避免在 SQL 服务器中锁定 - 这是正确的吗?

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

最佳答案

I think I can set it up to fire off the multiple calls asynchronously but I'm not sure how to check when all tasks have been completed i.e. ready to commit to db.

是的,你可以打破它

问题是 ebay 没有 async Task Execute方法,因此您只剩下阻塞线程调用,并且没有IO 优化 异步等待模式。如果有,您可以利用 TPL 数据流 管道,即 async意识到(全家人一起玩的乐趣),你无论如何都可以,尽管我提出了一个普通的 TPL 解决方案......

然而,一切并没有丢失,只是回退到Parallel.For和一个 ConcurrentBag<OrderType>

示例

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 启动您自己的线程。类


I've read somewhere that I want to avoid combining the API call and the db write to avoid locking in SQL server - Is this correct?

  • 如果您的意思是在缓慢的数据库插入中进行锁定,请使用 Sql 批量插入和更新工具。
  • 如果您指的是数据库死锁错误消息中的锁定,那么这是完全不同的事情,值得自己提出问题

其他资源

For(Int32, Int32, ParallelOptions, Action)

Executes a for (For in Visual Basic) loop in which iterations may run in parallel and loop options can be configured.

ParallelOptions Class

Stores options that configure the operation of methods on the Parallel class.

MaxDegreeOfParallelism

Gets or sets the maximum number of concurrent tasks enabled by this ParallelOptions instance.

ConcurrentBag Class

Represents a thread-safe, unordered collection of objects.

关于c# - 长 API 调用 - 异步调用答案?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53057193/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com