格伦,
这根本不是 Flex 中线程的工作方式。像许多 UI 一样,它在主 UI 线程上有一个消息泵(它们在框架中执行)。当您调用callLater()时,它会将传入的函数指针放在消息泵队列的末尾(在下一帧上)并立即返回。当消息泵之前完成所有消息的处理(如鼠标单击)时,该函数将被调用。
问题是,当属性更改导致 UI 事件被触发时,它们会将自己的消息放在泵上,这些消息现在来自您从callLater()放置的方法调用之后。
Flex 确实有多个线程,但它们的存在是出于 Adobe 自身的原因,因此用户无法访问。我不知道是否有办法保证 UI 更新将在特定点发生,但一种选择是调用callLater多次,直到操作发生。从一个小数字开始并增加,直到迭代次数产生您想要的结果。例子:
// Change this to a number that works... it will probably be over 1, depending on what you're doing.
private const TOTAL_CALL_COUNT:int = 5;
private var _timesCalled:int = 0;
//----------------------------------------------------------------
private function set Progress( progress:int ):void
{
progressBar.value = progress;
DoNextFunction();
}
//----------------------------------------------------------------
private function DoNextFunction():void
{
if( _timesCalled >= TOTAL_CALL_COUNT )
{
_timesCalled = 0;
Function();
}
else
{
_timesCalled++;
callLater( DoNextFunction );
}
}