概述: 我们公司需要一个可以访问本地资源(RS232/串行设备)的网络应用程序。经过一些研究和 POC,我们放弃了 ActiveX、Java Applets 等选项,并决定创建本地应用程序(用 C# 编写,稍后将转换为服务并分发给客户)读取串行数据并通过 HTTP 协议(protocol)为它们提供服务(简单的 TCP 服务器回答必要的 header + 普通串行数据)。然后 Web 应用程序对“http://localhost:8080”执行 AJAX 读取这些数据。
所有这些都是在 web worker 中完成的,在一个 while 循环中将消息发布到主线程,并将其填充到表单的输入元素中。通过提供静态内容,我可以获得不错的性能。在 Windows 上的 Chrome 13 中,较旧的 Intel 双核(不是 Core 2 Duo)1.6GHz CPU 每秒迭代 300-350 次,网络工作线程占用 5-9% 的 CPU。
问:我现在想要实现的是通过在每个 ajax 请求之后插入某种 sleep() 函数来限制 web worker 中的轮询间隔,例如开始时尝试 100ms。
在不牺牲线程中的 CPU 资源的情况下,最佳解决方案是什么?
注意:作为最后的手段,我可以在 TCP 服务器代码中插入一些延迟。
编辑:
我需要睡在 worker 里面。示例(为清楚起见过度简化):
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 */
}
最佳答案
我认为最好的解决方案是 WebSocket API .因此,您可以在 Web 应用程序中附加一个事件监听器,并在每次需要执行某些操作时从 C# 中触发它。
关于javascript - 在不牺牲 CPU 资源的情况下在 JavaScript web worker 中休眠,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6423567/