我有一个Windows应用程序,必须每秒拨打一次API调用20次。
要求是读取必须非常接近(在几毫秒内)。
以下代码使用每秒运行一次的计时器。 aaList是一个包含20个对象的列表。
不幸的是,使用当前的代码,有些读取是在不同的时间完成的(有时候是半秒钟),所以显然在某个地方形成了瓶颈。
有人可以建议如何以更加同步的方式实现我的要求吗? (也许我应该以不同的方式这样做?)
private void tmrAAProcess_Tick(object state)
{
foreach (aa in aaList) {
Task.Factory.StartNew(() =>
{
aa.ReadFromWebsite();
}, TaskCreationOptions.LongRunning);
}
}
答案 0 :(得分:1)
一个可能的问题是ServicePointManager默认只允许两个并发连接到同一站点。您必须更改DefaultConnectionLimit
属性。
另一个问题是TPL会限制你的并行性。我不知道你的ReadFromWebsite
方法做了什么,但是如果它正在进行阻止调用(即HttpWebRequest.GetResponse
),那么很可能你最终会得到一堆排队的任务。
我无法想象你会得到每个请求持续50毫秒的速度。除非它是内部服务器,否则通信时间本身可能会超过这个时间。一段时间后,您的机器将耗尽连接,因为它正在等待响应。无论是那个,还是你的所有排队任务都会耗尽内存。
如果你想做这项工作,至少你必须:
ServicePointManager.DefaultConnectionLimit
你应该保留最后N个(一些相当小的数字,如20个)请求的响应时间的运行平均值,而不是比这更快地发出请求。