我正试图抓住AS3工作人员的责任,但必须有一些难以捉摸的理解才能逃脱我。
我已经构建了一个相当简单的PoC,看看它应该如何工作,但没有运气。当我运行“主”SWF时,它似乎可以加载工作者SWF并且顺利完成所有操作,除非血腥工作者没有响应。
我正在使用Flash Builder 4.6和FlexSDK 4.9.1,PoC项目是作为ActionScript项目构建的。
工人档案:
package
{
import flash.display.Sprite;
import flash.events.Event;
import flash.system.MessageChannel;
import flash.system.Worker;
public class WorkerPOC extends Sprite
{
private var wToM:MessageChannel;
private var mToW:MessageChannel;
public function WorkerPOC()
{
wToM = Worker.current.getSharedProperty("wToM") as MessageChannel;
mToW = Worker.current.getSharedProperty("mToW") as MessageChannel;
trace(mToW.receive());
wToM.send("Ready");
}
}
}
主文件:
package
{
import flash.display.Sprite;
import flash.events.Event;
import flash.net.URLLoader;
import flash.net.URLLoaderDataFormat;
import flash.net.URLRequest;
import flash.system.MessageChannel;
import flash.system.Worker;
import flash.system.WorkerDomain;
import flash.utils.ByteArray;
public class WorkerMaster extends Sprite
{
private var workerLoader:URLLoader;
private var workerData:ByteArray;
private var worker:Worker;
private var wToM:MessageChannel;
private var mToW:MessageChannel;
public function WorkerMaster()
{
workerLoader = new URLLoader();
workerLoader.dataFormat = URLLoaderDataFormat.BINARY;
addEventListener(Event.ADDED_TO_STAGE, onAdded);
}
private function onAdded(event:Event):void
{
removeEventListener(Event.ADDED_TO_STAGE, onAdded);
workerLoader.addEventListener(Event.COMPLETE, onHasWorker);
workerLoader.load(new URLRequest("workers/WorkerPOC.swf"));
}
private function onHasWorker(event:Event):void
{
workerData = workerLoader.data as ByteArray;
workerData.shareable = true;
worker = WorkerDomain.current.createWorker(workerData);
wToM = worker.createMessageChannel(Worker.current);
wToM.addEventListener(Event.CHANNEL_MESSAGE, onMessage);
wToM.addEventListener(Event.CHANNEL_STATE, onState);
mToW = Worker.current.createMessageChannel(worker);
worker.setSharedProperty("wToM",wToM);
worker.setSharedProperty("mToW",mToW);
worker.start();
mToW.send(123);
}
private function onState(event:Event):void
{
trace("Channel state: ", wToM.state);
}
private function onMessage(event:Event):void
{
trace(wToM.receive());
}
}
}
答案 0 :(得分:1)
听起来很奇怪,但你已经申请了
-swf-verion=XXX // XXX must be > 17
作为编译器参数?我问这个,因为我有一个非常相似的问题:) Workers in Apache Flex 4.7
答案 1 :(得分:1)
我也和工人一起工作过。我让他们工作了一段时间然后一切都有点停止了,就像你的工作不一样。
看起来messagechannel没有在11.7中的调试中正确发送消息。
不确定为什么会发生这种情况,但是在创建工作程序时尝试运行代码而不连接调试器。当我这样做它工作正常......