2014-05-01 78 views
0

在我的网络工作者,我必须做一个循环处理吨。在C#或Java世界中,我将按如下方式对其进行编码(Java):在网络工作者中产生 - setTimeout够了,还是我必须退出?

// 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; 
} 

以上不适用于web worker。当主循环运行在上面时,后续的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()是否会产生?或者它只是排队的是呼吁处理后我目前表演结束?

+0

'it'从哪里获得物品? – Bergi

+0

所以你想从另一个postMessage处理程序调用'abort()'来拦截“循环”? – Bergi

+0

@Bergi - 不,我只想调用yield来处理一个postMessage,我可以得到另一个。 –

回答

0

我已经运行一些测试,我相信答案是你必须退出你所在的方法。的setTimeout()排队的最多的方法,但是,直到有没有在网络工作者运行将不会运行它。