首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >同步异步API调用

同步异步API调用
EN

Stack Overflow用户
提问于 2013-04-03 06:55:39
回答 1查看 447关注 0票数 0

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

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

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

不幸的是,在我目前的代码中,一些读取是在不同的时间完成的(有时是半秒后),所以显然在某个地方形成了瓶颈。

有没有人能建议如何以更同步的方式实现我的需求?(也许我应该用一种不同的方式来做这件事?)

代码语言:javascript
运行
复制
private void tmrAAProcess_Tick(object state)
{

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

     }

}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-04-03 08:46:36

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

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

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

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

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

您应该保持最后N个(一些合理的小数字,如20)请求的响应时间的运行平均值,并且请求的速度不能超过这个数字。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15775899

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档