Uma tarefa é um objeto usado para representar o estado de uma função assíncrona
Tarefas são executadas simultaneamente em um ambiente multitarefas cooperativamente.
Uma tarefa pode ser de duração, com base em uma vida útil de uma ou mais atualizações antes de ser concluída.
Tarefas podem ser sequenciais, sobrepostas, escalonadas e assim por diante, em qualquer ordem lógica.
A sequência e o fluxo de sobreposição de tarefas são especificados por meio do uso de expressões de simultaneidade estruturada ou simultaneidade não estruturada.
Cada tarefa pode ser concorrencialmente arranjada de forma sequencial, sobreposta, irregular etc. em qualquer ordem lógica de tempo. Internamente, a tarefa pode ter um chamador (ou até vários chamadores) e zero ou mais subtarefas dependentes que formam um gráfico de chamadas (ao contrário da pilha de chamadas).
Uma tarefa é semelhante a uma thread, mas tem vantagem sobre as threads porque a alternância de contexto entre tarefas não envolve chamadas do sistema, economia cara de estado de contexto ou chamadas de bloqueio de processador, e um processador pode ser 100% utilizado). Você não precisa de sincronização, como mutexes ou semáforos, para proteger seções críticas, e não há necessidade de suporte do sistema operacional.
A classe task(t:type) permite consultas programáticas diretas e manipulação de tarefas de maneira não estruturada, embora seja geralmente recomendado que as tarefas sejam manipuladas por meio de expressões de simultaneidade estruturadas para maior clareza, poder e eficiência.
Atualmente, a única função exposta para task é Await(), que espera até que a tarefa atual seja concluída. Isso basicamente ancora uma tarefa e adiciona um chamador para que ela retorne ao ponto de chamada.
spawn{AsyncFunction3()}
# Get task to query / give commands to
# starts and continues independently
Task2 := spawn{Player.MoveTo(Target1)}
Sleep(1.5) # Wait 1.5 Seconds
MyLog.Print("1.5 Seconds into Move_to()")
Task2.Await() # wait until MoveTo() completed
Semelhante ao exemplo acima, o abaixo usa expressões estruturadas de simultaneidade:
sync:
AsyncFunction3() # Task 1
block:
Player.MoveTo(Target1) # Task 2
Sleep(0.5) # Wait 0.5 Seconds
Target1.MoveTo(Target2)
block: # Task 3
Sleep(1.5) # Wait 1.5 Seconds
MyLog.Print("1.5 Seconds into Move_to()")