同步异步API调用

本文关键字:调用 API 异步 同步 | 更新日期: 2023-09-27 18:07:19

我有一个Windows应用程序,它必须每秒调用20次API。

要求读取必须非常接近于同时完成(毫秒内)。

下面的代码使用了一个每秒运行一次的计时器。aaList是一个包含20个对象的列表。

对于我目前的代码,不幸的是,一些读取是在不同的时间完成的(有时半秒后),所以很明显瓶颈正在某处形成。

有谁能建议如何以更同步的方式实现我的要求吗?(也许我应该用一种不同的方式来做这件事?)

private void tmrAAProcess_Tick(object state)
{
     foreach (aa in aaList) {
          Task.Factory.StartNew(() =>
          {                       
             aa.ReadFromWebsite();
          }, TaskCreationOptions.LongRunning);
     }
}

同步异步API调用

一个可能的问题是ServicePointManager默认只允许两个并发连接到同一个站点。例如,您必须更改DefaultConnectionLimit属性。

另一个问题是TPL将限制你的并行性。我不知道你的ReadFromWebsite方法做什么,但如果它做了一个阻塞调用(即HttpWebRequest.GetResponse),很可能你最终会得到一堆排队的任务。

我无法想象你会得到每个请求50毫秒的持续速率。单独的通信时间可能会超过这个时间,除非是内部服务器。您的机器将在一段时间后耗尽连接,因为它正在等待响应。否则,您将耗尽所有排队任务的内存。

如果你想让这个工作,你必须至少:

  1. 修改ServicePointManager.DefaultConnectionLimit
  2. 发送异步web请求
  3. 使用队列或信号量或类似的东西显式限制并发未完成请求的数量。

您应该保持最近N个请求(一些合理的小数字,例如20个)响应时间的运行平均值,并且不要发出比这个更快的请求。