4

概述:我们公司需要可以访问本地资源(RS232 / 串行设备)的 Web 应用程序。经过一些研究和 POC,我们放弃了 ActiveX、Java Applets 等选项,并决定创建本地应用程序(用 C# 编写,稍后将转换为服务并分发给客户)读取串行数据并通过 HTTP 协议提供服务(简单的 TCP 服务器回答必要的标头 + 纯串行数据)。然后 Web 应用程序执行 AJAX 以“http://localhost:8080”读取这些数据。

所有这些都是在一个网络工作者中完成的,在一个while循环中将消息发送到主线程,并将其填充到表单的输入元素中。通过提供静态内容,我可以获得不错的性能。在 Windows 上 Chrome 13 中较旧的 Intel 双核(不是 Core 2 Duo)1.6GHz CPU 上,每秒迭代 300-350 次,网络工作线程占用 5-9% 的 CPU。

问:我现在想要实现的是通过在每个 ajax 请求之后插入某种 sleep() 函数来限制 web worker 中的轮询间隔,例如在开始时尝试 100 毫秒。

在不牺牲线程中的 CPU 资源的情况下,最好的解决方案是什么?

注意:我可以在 TCP 服务器代码中插入一些延迟作为最后的手段。

编辑:

我需要睡在工人里面。示例(为清楚起见过度简化):

AJAX = new XMLHttpRequest();
while (true) {
  AJAX.open("GET", "http://127.0.0.1:8080", false);
  AJAX.send(null);
  var ean = AJAX.responseText;
  if (ean != '') { postMessage(ean); }
  /* NEED TO SLEEP HERE WHETHER THE RESPONSE WAS SENT OR NOT */
}
4

2 回答 2

1

我认为最好的解决方案是WebSocket API。因此,您可以在 Web 应用程序中附加一个事件侦听器,并在每次需要执行某些操作时从 C# 中触发它。

于 2011-06-21T10:18:05.150 回答
0

不幸的是,javascript 中没有睡眠或等待功能 - 但您可以使用使用超时和回调来模拟一个。(通过回调函数“跳转”到代码的其余部分 - 并将调用放在 setTimeout 方法中)。

编辑:

你可以做这样的事情,

AJAX = new XMLHttpRequest();
var myInterval = setInterval( function(){
    AJAX.open("GET", "http://127.0.0.1:8080", false);
    AJAX.send(null);
    var ean = AJAX.responseText;
    if (ean != '') { postMessage(ean); }
},120);

现在,如果您不等待第一次调用,请将其放在间隔之外(因此它会立即运行),然后再次调用间隔,如上面所写。

于 2011-06-21T10:14:34.680 回答