我有一个Windows应用程序,它每秒必须进行20次API调用。
要求是读取必须非常接近同步(在毫秒内)。
下面的代码使用每秒运行的计时器。aaList是一个包含20个对象的列表。
不幸的是,在我目前的代码中,一些读取是在不同的时间完成的(有时是半秒后),所以显然在某个地方形成了瓶颈。
有没有人能建议如何以更同步的方式实现我的需求?(也许我应该用一种不同的方式来做这件事?)
private void tmrAAProcess_Tick(object state)
{
foreach (aa in aaList) {
Task.Factory.StartNew(() =>
{
aa.ReadFromWebsite();
}, TaskCreationOptions.LongRunning);
}
}发布于 2013-04-03 08:46:36
一个可能的问题是ServicePointManager默认只允许两个并发连接到同一站点。例如,您必须更改DefaultConnectionLimit属性。
另一个问题是,TPL会限制你的并行性。我不知道你的ReadFromWebsite方法是做什么的,但如果它做一个阻塞调用(即HttpWebRequest.GetResponse),你很可能只会得到一堆排队的任务。
我无法想象你会得到一个持续的50毫秒的请求速率。除非它是内部服务器,否则仅通信时间就可能会超过这一时间。您的机器将在一段时间后耗尽连接,因为它正在等待响应。否则,所有这些排队的任务都会耗尽内存。
如果你想完成这项工作,你至少必须:
ServicePointManager.DefaultConnectionLimit您应该保持最后N个(一些合理的小数字,如20)请求的响应时间的运行平均值,并且请求的速度不能超过这个数字。
https://stackoverflow.com/questions/15775899
复制相似问题