【发布时间】:2014-05-01 19:15:03
【问题描述】:
在我的网络工作者中,我必须在一个循环中进行大量处理。在 C# 或 Java 世界中,我会将其编码如下(Java):
// main code:
public static void mainLoop() {
for (Iterator it=getIterator(); it.hasNext() && keepRunning; ) {
Object item = it.next();
processThisOne (item);
}
}
// async method
static boolean keepRunning = true;
public static void abort() {
keepRunning = false;
}
以上内容不适用于网络工作者。当主循环在上面运行时,后续的 postMessage() 调用将被处理。
我可以执行以下操作(现在在打字稿中):
// kicked off by postMessage event handler
public mainLoop () : void {
if (! keepRunning)
return;
Object item = it.next();
processThisOne (item);
worker.setTimeout(mainLoop, 0);
}
// also callable by postMessage event handler:
static boolean keepRunning = true;
public static void abort() {
keepRunning = false;
}
相反,我基本上可以按如下方式屈服吗?如果是这样,这是否一样快(在 setTimeout 上的线程之间进行任务切换)?
// kicked off by postMessage event handler
public mainLoop () : void {
for (Iterator it=getIterator(); it.hasNext() && keepRunning; ) {
Object item = it.next();
processThisOne (item);
// yield
worker.setTimeout(nothing, 0);
}
}
// called by setTimeout:
public static void nothing() {
}
// also callable by postMessage event handler:
static boolean keepRunning = true;
public static void abort() {
keepRunning = false;
}
如果上述方法有效,那么我的代码会更简单。问题是, setTimeout() 会产生吗?或者它只是在我目前正在执行的处理结束后排队等待该调用?
【问题讨论】:
-
it从哪里获取项目? -
所以你想从另一个 postMessage 处理程序调用
abort()来拦截“循环”? -
@Bergi - 不,我只想调用 yield 所以在处理一个 postMessage 的过程中我可以得到另一个。
标签: javascript typescript settimeout web-worker