operator tunggu - secara asinkron menunggu tugas selesai
Operator await
menangguhkan evaluasi metode asinkron penutup hingga operasi asinkron yang diwakili oleh operand selesai. Ketika operasi asinkron selesai, operator await
mengembalikan hasil operasi, jika ada. Ketika operator await
diterapkan ke operand yang mewakili operasi yang sudah selesai, operator akan segera mengembalikan hasil operasi tanpa penangguhan metode penutup. Operator await
tidak memblokir utas yang mengevaluasi metode asinkron. Ketika operator await
menangguhkan metode asinkron penutup, kontrol kembali ke pemanggil metode.
Dalam contoh berikut, metode HttpClient.GetByteArrayAsync mengembalikan instans Task<byte[]>
, yang mewakili operasi asinkron yang menghasilkan array byte saat operasi tersebut selesai. Sampai operasi selesai, operator await
menangguhkan metode DownloadDocsMainPageAsync
. Ketika DownloadDocsMainPageAsync
ditangguhkan, kontrol dikembalikan ke metode Main
, yang merupakan pemanggil DownloadDocsMainPageAsync
. Metode Main
ini dijalankan sampai membutuhkan hasil operasi asinkron yang dilakukan oleh metode DownloadDocsMainPageAsync
. Ketika GetByteArrayAsync mendapatkan semua byte, sisa metode DownloadDocsMainPageAsync
dievaluasi. Setelah itu, sisa metode Main
akan dievaluasi.
public class AwaitOperator
{
public static async Task Main()
{
Task<int> downloading = DownloadDocsMainPageAsync();
Console.WriteLine($"{nameof(Main)}: Launched downloading.");
int bytesLoaded = await downloading;
Console.WriteLine($"{nameof(Main)}: Downloaded {bytesLoaded} bytes.");
}
private static async Task<int> DownloadDocsMainPageAsync()
{
Console.WriteLine($"{nameof(DownloadDocsMainPageAsync)}: About to start downloading.");
var client = new HttpClient();
byte[] content = await client.GetByteArrayAsync("https://learn.microsoft.com/en-us/");
Console.WriteLine($"{nameof(DownloadDocsMainPageAsync)}: Finished downloading.");
return content.Length;
}
}
// Output similar to:
// DownloadDocsMainPageAsync: About to start downloading.
// Main: Launched downloading.
// DownloadDocsMainPageAsync: Finished downloading.
// Main: Downloaded 27700 bytes.
Operand await
ekspresi harus menyediakan pemberitahuan saat tugas selesai. Secara umum, delegasi dipanggil ketika tugas selesai, baik berhasil atau tidak berhasil. Bagian await
spesifikasi bahasa C# memberikan detail tentang bagaimana pemberitahuan ini diterapkan.
Contoh sebelumnya menggunakan metode asinkronMain
. Untuk informasi selengkapnya, lihat bagian operator await di Metode utama.
Catatan
Untuk pengenalan pemrograman asinkron, lihat Pemrograman Asinkron dengan async dan await. Pemrograman asinkron dengan async
dan await
yang mengikuti pola asinkron berbasis tugas.
Anda hanya dapat menggunakan operator await
dalam metode, ekspresi lambda, atau metode anonim yang dimodifikasi oleh kata kunci async. Dalam metode asinkron, Anda tidak dapat menggunakan await
operator dalam isi fungsi lokal yang sinkron, di dalam blok pernyataan kunci, dan dalam konteks yang tidak aman .
Operand operator await
biasanya dari salah satu jenis .NET berikut: Task, Task<TResult>, ValueTask, atau ValueTask<TResult>. Namun, ekspresi penangguhan apa pun dapat menjadi operand operator await
. Untuk informasi selengkapnya, lihat bagian Ekspresi Penangguhan dari spesifikasi bahasa pemrogram C#.
Jenis dari ekspresi await t
adalah TResult
jika jenis dari ekspresi t
merupakan Task<TResult> atau ValueTask<TResult>. Jika jenis t
adalah Task atau ValueTask, jenis dari await t
adalah void
. Dalam kedua kasus tersebut, jika t
melemparkan pengecualian, await t
melemparkan kembali pengecualian.
Aliran asinkron dan sekali pakai
Anda menggunakan pernyataan await foreach
untuk memakai aliran data asinkron. Untuk informasi selengkapnya, lihat foreach
bagian pernyataan dari artikel Pernyataan perulangan.
Anda menggunakan pernyataan await using
untuk bekerja dengan objek sekali pakai secara asinkron, yaitu objek jenis yang menerapkan antarmuka IAsyncDisposable. Untuk informasi selengkapnya, lihat bagian Menggunakan async disposable dari artikel Menerapkan metode DisposeAsync.
operator await dalam metode Utama
Metode Main
, yang merupakan titik masuk aplikasi, dapat mengembalikan Task
atau Task<int>
, memungkinkannya menjadi asinkron sehingga Anda dapat menggunakan await
operator dalam isinya. Dalam versi C# sebelumnya, untuk memastikan bahwa metode Main
menangguhkan penyelesaian operasi asinkron, Anda dapat mengambil nilai properti Task<TResult>.Result dari instans Task<TResult> yang dikembalikan oleh metode asinkron yang sesuai. Untuk operasi asinkron yang tidak menghasilkan nilai, Anda dapat memanggil metode Task.Wait. Untuk informasi tentang cara memilih versi bahasa, lihat penerapan versi bahasa pemrogram C#.
Spesifikasi bahasa C#
Untuk informasi selengkapnya, lihat bagian Ekspresi Await dari spesifikasi bahasa pemrogram C#.