0

我在使用不同应用程序和语言的异步任务时遇到了一些困难。

据我所知,典型的用法是这样的:

asyncTask(x,y){
    //do something
}

alwaysRunWhenAsyncIsFinished(){
    //continue with the app has to 
    //happen here
}

...

mainProgramFunction(){
    asyncTask(5,6);
}

那么在这种情况下,您必须编写程序直到异步任务发生,并且当您必须调用 asyncTask 时,您必须在 Recall Function 中编写继续代码,这是始终在异步任务之后发生的函数。

有没有可能写这样的东西:

asyncTask(x,y){
    //do something
}


...

mainProgramFunction(){
    asyncTask(5,6);

    continuingCode();//But happens AFTER asyncTask is done.
}

我不完全知道这是否可能。也许这只能通过提供这种异步任务的特定 sdk 来实现?

最后一个选项可能是我并不真正了解异步任务以及如何使用它们。

4

2 回答 2

0

您的

 Kick off a task

 Keep doing stuff

许多编程语言都支持程序结构模型。例如在 Java 中可以有

 Runnable myRunnable = new MyRunnable();

 new Thread(myRunnable).start();

 doSomeMore();

但是,这可能会有点混乱。您正在启动线程,这可能会无限期地运行,因此您的“主线”可能会在线程全部停止工作时到达终点。你没有“监督”线程来跟踪这项工作。更糟糕的是,您最终可能会触发过多的线程并耗尽所有处理能力。

因此,在不同的线程中进行所有处理是很常见的,这是一种事件驱动的编程风格。所以你有一个线程来监听诸如工作线程完成和决定创建哪些新工作等事件。或者可能是一个线程监听新请求(例如,用户单击某物,或者正在创建文件或消息到达)并决定是否以及何时启动工作人员。

一般来说,现代 UI 几乎完全是事件驱动的,大部分代码都在事件处理程序中(当用户单击它时执行操作),您自己不会编写 main,UI 框架在控制并调用您的代码。

我认为您会发现学习有关事件驱动编程的教程很有帮助。

于 2012-09-17T06:37:14.513 回答
0

mainProgramFunction(){ asyncTask(5,6);

continueCode();//但是发生在 asyncTask 完成之后。}

好吧,如果 continueCode() 必须在 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;
}

(请注意,这是伪代码,每种语言都有关于如何“等待”部分的良好实践!)。

另一种(当然更好的方法)是使用事件驱动逻辑......

于 2019-05-28T07:44:57.127 回答