タスクは、現在実行中の非同期関数の状態を表すために使用されるオブジェクトです。 タスク オブジェクトは、非同期関数が中断している場所と、その中断点におけるローカル変数の値を特定するために使用されます。
タスクは、協調的なマルチタスク環境で同時に実行されます。
タスクは、完了するまでの間、1 つ以上の更新の有効期限に基づいて持続的に実行できます。
タスクは、論理的な順序で順次実行したり、重ねて実行したり、重ならないように実行したりすることが可能です。
タスクの順次実行と重ねての実行のフローは、構造化並列処理または非構造化並列処理式を使用して指定されます。
各タスクは、論理的な時間順で連続して並列で配置したり、重ねたり、重ならないように調整したりできます。 タスク内には、1 つの呼び出し元 (場合によっては複数の呼び出し元) と (コール スタックとは対照的に) コール グラフを形成する 0 個以上の依存するサブタスクが含まれることがあります。
タスクは、スレッドに似てはいますが、タスク間でコンテキスト スイッチを行うときに、システム コール、負荷が大きいコンテキスト状態の保存、またはプロセッサをブロックするコールが必要なく、プロセッサを 100% 利用できることから、スレッドより優れています。 クリティカル セクションを守るためのミューテックスやセマフォなどの同期が必要なく、オペレーティング システムからのサポートも不要です。
task(t:type)
クラスにより、構造化されていない方法でのプログラムによる直接的なタスクのクエリと操作が可能になりますが、一般的には構造化並列処理式でタスクを操作することが、明確さ、処理能力、効率を高めるという意味で推奨されます。
現在のところ、公開されている task
の関数は、現在のタスクが完了するまで待つ Await()
のみです。 これは基本的にタスクを停止させ、この呼び出しポイントにタスクの戻り先となる呼び出し元を追加します。
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
上記の例と同じように、以下の例では構造化並列処理式を使用しています。
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()")