Görev (task), o sırada yürütülmekte olan asenk. bir fonksiyonun durumunu göstermek için kullanılan bir objedir. Görev objeleri, asenk. bir fonksiyonun nerede askıya alındığını ve söz konusu askıya alma noktasındaki yerel değişkenlerin değerlerini belirlemek için kullanılır.
Görevler, işbirliğine dayalı bir çoklu görev ortamında eşzamanlı olarak yürütülür.
Bir görev, tamamlanmadan önce bir veya daha fazla güncellemenin yaşam süresine dayalı olarak süreli olabilir.
Görevler sıralı, çakışmalı, kademeli vb. herhangi bir mantıksal sırada olabilir.
Görevlerin sırası ve çakışan akışı, yapılandırılmış veya yapılandırılmamış eşzamanlılık ifadeleri kullanılarak belirtilir.
Her görev, sıralı, çakışmalı, kademeli vb. herhangi bir mantıksal zaman sırasıyla eşzamanlı olarak düzenlenebilir. Dahili olarak, bir görevin (çağrı yığını değil de) bir çağrı grafiği oluşturan bir (hatta birçok) çağıranı ve sıfır veya sıfırdan fazla bağımlı alt görevi olabilir.
Görev, iş parçacığına benzer ancak görevler arasındaki bağlam değiştirmede herhangi bir sistem çağrısı, maliyetli bağlam durumu kaydetme veya işlemciyi bloklayan çağrılar söz konusu olmadığından ve işlemci %100 kullanılabileceğinden iş parçacıklarına göre avantaj sağlar . Kritik kısımları korumak için mutex’ler veya semaforlar gibi senkronizasyonlara ve işletim sisteminden destek almaya gerek yoktur.
task(t:type) sınıfı, görevlerin yapılandırılmamış bir şekilde doğrudan programatik sorgulama ve manipülasyonuna izin verir ancak genellikle daha fazla netlik, güç ve verimlilik için görevlerin yapılandırılmış eşzamanlılık ifadeleriyle manipüle edilmesi tavsiye edilir.
Şu anda task için kullanıma açılan tek fonksiyon, geçerli görev tamamlanana kadar bekleyen Await() fonksiyonudur. Esas olarak bir görevi sabitler ve çağrı noktasında geri dönmesi için ona bir çağıran ekler.
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
Yukarıdaki örneğe benzer şekilde, aşağıda yapılandırılmış eşzamanlılık ifadelerinin kullanıldığı bir örnek yer alıyor:
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()")