Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
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.
Referensi bahasa C# mendokumentasikan versi bahasa C# yang paling baru dirilis. Ini juga berisi dokumentasi awal untuk fitur dalam pratinjau publik untuk rilis bahasa yang akan datang.
Dokumentasi mengidentifikasi fitur apa pun yang pertama kali diperkenalkan dalam tiga versi terakhir bahasa atau dalam pratinjau publik saat ini.
Petunjuk / Saran
Untuk menemukan kapan fitur pertama kali diperkenalkan di C#, lihat artikel tentang riwayat versi bahasa C#.
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 Main asinkron. 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 ini Main berfungsi sebagai titik masuk aplikasi. Ini dapat mengembalikan Task atau Task<int>, yang membuatnya asinkron. Dengan membuat Main metode asinkron, Anda dapat menggunakan await operator dalam isinya. Dalam versi C# sebelumnya, untuk memastikan bahwa Main metode menunggu penyelesaian operasi asinkron, ambil nilai Task<TResult>.Result properti Task<TResult> instans yang dikembalikan metode asinkron yang sesuai. Untuk operasi asinkron yang tidak menghasilkan nilai, panggil Task.Wait metode . 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#.