Apakah konversi implisit terjadi antara Tugas <> dan int?
Nggak. Ini hanyalah bagian dari cara async/ awaitbekerja.
Metode apa pun yang dideklarasikan asyncharus memiliki tipe kembalian:
void (hindari jika memungkinkan)
Task (tidak ada hasil selain pemberitahuan penyelesaian / kegagalan)
Task<T>(untuk hasil logis dari tipe Tdengan 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 awaitekspresi pertama yang belum selesai. Jadi, ia mengembalikan nilai Task<int>yang akan selesai ketika metode asinkron itu sendiri selesai.
Perhatikan bahwa awaittidak sebaliknya - itu unwraps sebuah Task<T>ke Tnilai, yang adalah bagaimana baris ini bekerja:
string urlContents = await getStringTask;
... tapi tentu saja itu membuka bungkusnya secara tidak sinkron, sedangkan hanya menggunakan Resultakan memblokir sampai tugas selesai. ( awaitdapat 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.)
asynckata kunci.