0

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

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

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

不幸的是,使用我当前的代码,一些读取是在不同的时间(有时半秒后)完成的,所以很明显瓶颈正在某个地方形成。

谁能建议如何以更同步的方式实现我的要求?(也许我应该以不同的方式做到这一点?)

private void tmrAAProcess_Tick(object state)
{

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

     }

}
4

1 回答 1

1

一个可能的问题是ServicePointManager默认只允许两个并发连接到同一个站点。你必须改变DefaultConnectionLimit财产,一个。

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

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

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

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

您应该保持最后 N 个(一些相当小的数字,例如 20 个)请求的响应时间的平均运行时间,并且不要让请求比这更快。

于 2013-04-03T00:46:35.610 回答