我在不同的应用程序和语言中使用异步任务时遇到了一些困难。
据我所知,典型用法如下:
asyncTask(x,y){
//do something
}
alwaysRunWhenAsyncIsFinished(){
//continue with the app has to
//happen here
}
...
mainProgramFunction(){
asyncTask(5,6);
}
在这种情况下你必须编写你的程序,直到异步任务发生,并且当你必须调用asyncTask时,你必须在Recall Function中编写继续的Code,这个函数总是在异步任务。
是否有可能写出这样的东西:
asyncTask(x,y){
//do something
}
...
mainProgramFunction(){
asyncTask(5,6);
continuingCode();//But happens AFTER asyncTask is done.
}
我不确切知道这是否可行。也许这只能通过特定的sdk实现,它提供了这种异步任务吗?
最后一个选项可能是我并不真正了解异步任务以及如何使用它们。
答案 0 :(得分:0)
你的
Kick off a task
Keep doing stuff
程序结构模型受到许多编程语言的支持。例如,在Java中可以有
Runnable myRunnable = new MyRunnable();
new Thread(myRunnable).start();
doSomeMore();
然而,这可能会有点混乱。你正在关闭线程,这可能会无限期地运行,所以你的“主线”可能会到达终点而线程完全没有工作。你没有“监督”线程来跟踪这项工作。更糟糕的是,你可能最终会解雇过多的线程并耗尽所有处理能力。
因此,在不同的线程中进行所有处理是很常见的,这是一种事件驱动的编程风格。因此,您有一个线程正在侦听诸如工作线程完成和决定要创建哪些新工作程序等事件。或者也许是线程正在侦听新请求(例如,用户点击某些内容,或正在创建的文件或到达的消息)以及决定是否以及何时启动工作人员。
一般情况下,现代用户界面几乎完全是事件驱动的,大多数代码都在事件处理程序中(当用户点击 时 ),你不是自己写一个main,UI框架处于控制之中并调用你的代码。
我认为你会发现研究a tutorial有关事件驱动编程的方法很有帮助。
答案 1 :(得分:0)
mainProgramFunction(){ asyncTask(5,6);
continuingCode(); //但是发生在asyncTask完成之后。 }
好吧,如果continuationCode()必须在asyncTask()之后运行,那么您将离开异步世界(-:
但是,如果您需要异步执行某项操作,然后等待所有任务继续执行,则可以使用信号量作为示例:
mainProgramFunction(){
bool taskDone = false;
asyncTask(5,6);
doSometingElse();
while(taskDone != true){
// wait
}
continuingCode();//But happens AFTER asyncTask is done.
}
asyncTask(a,b){
// compute a and b
taskDone = true;
}
(请注意,这是伪代码,每种语言都有关于如何进入“等待”部分的良好做法!)。
另一种(肯定更好的方法)是使用事件驱动的逻辑...