同步异步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);
}
}
一个可能的问题是ServicePointManager默认只允许两个并发连接到同一个站点。例如,您必须更改DefaultConnectionLimit
属性。
另一个问题是TPL将限制你的并行性。我不知道你的ReadFromWebsite
方法做什么,但如果它做了一个阻塞调用(即HttpWebRequest.GetResponse
),很可能你最终会得到一堆排队的任务。
我无法想象你会得到每个请求50毫秒的持续速率。单独的通信时间可能会超过这个时间,除非是内部服务器。您的机器将在一段时间后耗尽连接,因为它正在等待响应。否则,您将耗尽所有排队任务的内存。
如果你想让这个工作,你必须至少:
- 修改
ServicePointManager.DefaultConnectionLimit
- 发送异步web请求
- 使用队列或信号量或类似的东西显式限制并发未完成请求的数量。
您应该保持最近N个请求(一些合理的小数字,例如20个)响应时间的运行平均值,并且不要发出比这个更快的请求。