如何避免循环调用 web api?

Posted

技术标签:

【中文标题】如何避免循环调用 web api?【英文标题】:How to avoid calling web api in loops? 【发布时间】:2020-08-20 04:35:01 【问题描述】:

我有两个 web api

    发布 API - 将数据从一个数据库复制到另一个数据库。完成该过程通常需要 10-15 分钟。 GetStatus API - 获取发布 API 的状态。有效状态为 Running、Failed 和 Completed。

现在,我正在调用 Publish API 然后在循环中我正在调用 GetStatus API 并且服务器加载了太多对 GetStatus API。每 10-15 毫秒调用一次 GetStatus api。

如何避免这种情况?任何更好的解决方案都应该受到高度赞赏。

【问题讨论】:

"现在,我将调用发布 API,然后循环调用 GetStatus API,服务器加载了太多的 GetStatus 请求。" - 什么?!? 你应该阅读How to Ask。 【参考方案1】:

嗯...你应该在循环中等待...

理想情况下,您使用的是异步,因此您可以这样做:

ApiStatus status = null;
do 
    var status = await api.GetStatus();
    await Task.Deplay(TimeSpan.FromSeconds(5), cancellationToken);
  
 while (status == ApiStatus.Running);

或者如果不是类似的东西;

while (!_stopEvent.WaitOne(TimeSpan.FromSeconds(5))
    var status = api.GetStatus();
    if (status != ApiStatus.Running) break;

至少,您实际上不应该做的幼稚实现,而是向您展示最简单的情况......

while (true)
    var status = api.GetStatus();
    if (status != ApiStatus.Running) break;
    Thread.Sleep(5000);

【讨论】:

缺少异步关键字。为什么我们只使用 await 关键字。请赐教 我只是说理想情况下您使用的是异步。如果不是,请改用第二个选项。你可以在这里阅读异步:docs.microsoft.com/en-us/dotnet/csharp/async

以上是关于如何避免循环调用 web api?的主要内容,如果未能解决你的问题,请参考以下文章

如何避免在Reactjs中每次都调用API?

如何调用 Apple Music API 并避免 401

如何避免将null实体对象传递给web api方法

如何避免自启动 API 调用 Mobilefirst 平台服务器 V7.1

如何避免vue中api调用的onchange?

EF6:如何避免循环引用?