同时异步API调用

时间:2013-04-02 22:55:39

标签: c# multithreading asynchronous task-parallel-library

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

要求是读取必须非常接近(在几毫秒内)。

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

不幸的是,使用当前的代码,有些读取是在不同的时间完成的(有时候是半秒钟),所以显然在某个地方形成了瓶颈。

有人可以建议如何以更加同步的方式实现我的要求吗? (也许我应该以不同的方式这样做?)

private void tmrAAProcess_Tick(object state)
{

     foreach (aa in aaList) {
          Task.Factory.StartNew(() =>
          {                       
             aa.ReadFromWebsite();
          }, TaskCreationOptions.LongRunning);

     }

}

1 个答案:

答案 0 :(得分:1)

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

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

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

如果你想做这项工作,至少你必须:

  1. 修改ServicePointManager.DefaultConnectionLimit
  2. 制作异步网络请求
  3. 使用队列或信号量或类似内容明确限制并发未完成请求的数量。
  4. 你应该保留最后N个(一些相当小的数字,如20个)请求的响应时间的运行平均值,而不是比这更快地发出请求。