Pemanggil method asinkron membutuhkan sesuatu yang mewakili pekerjaan yang sedang berlangsung, karena hasilnya belum tersedia saat pemanggilan dilakukan. Tipe Task adalah tipe pustaka .NET yang memenuhi kebutuhan itu: sebuah objek yang menandai pekerjaan yang sedang berjalan, yang statusnya dapat kita periksa dan hasilnya dapat kita tunggu dengan await. Task dipakai untuk pekerjaan tanpa nilai kembali, sedangkan Task<T> dipakai ketika pekerjaan menghasilkan satu nilai bertipe T.
Status dan Siklus Task #
Setiap objek Task membawa properti Status yang bergerak melalui beberapa nilai:
Created: task baru dibuat dan belum mulai dieksekusi.WaitingForActivation: task sedang menunggu bagian pekerjaan yang belum selesai, misalnya timerTask.Delay.RanToCompletion: pekerjaan selesai tanpa galat.FaulteddanCanceled: pekerjaan berakhir karena exception atau pembatalan, yang dibahas pada bab Exception dalam Async dan bab Cancellation Token.
Pemanggilan method asinkron berjalan secara sinkron sampai await pertama. Setelah titik itu, method mengembalikan objek Task kepada pemanggil sementara sisanya menunggu.
Contoh: Task Tanpa Hasil dan Task dengan Hasil #
Kode berikut memulai satu Task untuk mencetak promo dan satu Task<int> untuk menghitung total belanja:
static async Task TampilkanPromoAsync()
{
await Task.Delay(50);
Console.WriteLine("Promo hari ini: gratis ongkir");
}
static async Task<int> HitungTotalAsync(int jumlah, int hargaSatuan)
{
await Task.Delay(100);
return jumlah * hargaSatuan;
}
// Pemanggil:
Task tanpaHasil = TampilkanPromoAsync();
Task<int> hitung = HitungTotalAsync(3, 15000);
Console.WriteLine($"Status awal hitung: {hitung.Status}");
await tanpaHasil;
int total = await hitung;
Console.WriteLine($"Total belanja: Rp{total}");
Console.WriteLine($"Status akhir hitung: {hitung.Status}");Output yang Dihasilkan:
Status awal hitung: WaitingForActivation
Promo hari ini: gratis ongkir
Total belanja: Rp45000
Status akhir hitung: RanToCompletionMari kita telaah baris-baris pentingnya:
Task tanpaHasil = TampilkanPromoAsync(): pemanggilan mengembalikan objekTasktanpa nilai; method cukupasync Taskkarena tidak mengembalikan apa pun.Task<int> hitung = HitungTotalAsync(3, 15000): objekTask<int>menjanjikan satu nilaiintyang belum tersedia.hitung.Status: status terbacaWaitingForActivationkarena method sudah berhenti diawait Task.Delaydan pekerjaan itu belum usai.int total = await hitung:awaitmengeluarkan nilai dariTask<int>; hasilawaitadalahint, bukanTask<int>lagi.hitung.Statuspada akhir: status berubah menjadiRanToCompletionsetelah nilai dikembalikan.
Bab berikutnya membongkar mekanisme kata kunci async dan await yang menjadi fondasi seluruh pola ini.