Apakah konversi implisit terjadi antara Tugas <> dan int?
Nggak. Ini hanyalah bagian dari cara async
/ await
bekerja.
Metode apa pun yang dideklarasikan async
harus memiliki tipe kembalian:
void
(hindari jika memungkinkan)
Task
(tidak ada hasil selain pemberitahuan penyelesaian / kegagalan)
Task<T>
(untuk hasil logis dari tipe T
dengan cara async)
Kompilator melakukan semua pembungkusan yang sesuai. Intinya adalah Anda kembali secara asinkronurlContents.Length
- Anda tidak dapat membuat metode hanya kembali int
, karena metode sebenarnya akan kembali ketika mencapai await
ekspresi pertama yang belum selesai. Jadi, ia mengembalikan nilai Task<int>
yang akan selesai ketika metode asinkron itu sendiri selesai.
Perhatikan bahwa await
tidak sebaliknya - itu unwraps sebuah Task<T>
ke T
nilai, yang adalah bagaimana baris ini bekerja:
string urlContents = await getStringTask;
... tapi tentu saja itu membuka bungkusnya secara tidak sinkron, sedangkan hanya menggunakan Result
akan memblokir sampai tugas selesai. ( await
dapat membuka jenis lain yang menerapkan pola yang dapat menunggu, tetapi yang Task<T>
paling sering Anda gunakan.)
Pembungkusan / pembungkusan ganda inilah yang memungkinkan asinkron menjadi begitu mudah disusun. Misalnya, saya bisa menulis metode asinkron lain yang memanggil Anda dan menggandakan hasilnya:
public async Task<int> AccessTheWebAndDoubleAsync()
{
var task = AccessTheWebAsync();
int result = await task;
return result * 2;
}
(Atau return await AccessTheWebAsync() * 2;
tentu saja.)
async
kata kunci.