Task <> ve int arasında örtük bir dönüşüm gerçekleşiyor mu?
Hayır! Bu sadece nasıl async/ awaitçalıştığının bir parçası .
Aşağıdaki gibi asyncbir dönüş türü olması gerektiği bildirilen herhangi bir yöntem :
void (mümkünse kaçının)
Task (tamamlanma / başarısızlık bildirimi dışında sonuç yok)
Task<T>( Tzaman uyumsuz bir şekilde türün mantıksal bir sonucu için )
Derleyici tüm uygun sarmalamayı yapar. Önemli olan, eşzamansız olarak geri döndüğünüzdür urlContents.Length- intgerçek yöntem, awaithenüz tamamlanmamış olan ilk ifadeye ulaştığında geri döneceğinden , yöntemi yalnızca geri döndüremezsiniz . Bunun yerine, Task<int>zaman uyumsuz yöntemin kendisi tamamlandığında tamamlanacak olan bir döndürür .
Not awaittersini yapar - bu unwraps bir Task<T>a Tbu hat işliyor değeri:
string urlContents = await getStringTask;
... ama tabii ki eşzamansız olarak açıyor, oysa sadece kullanmak Resultgörev tamamlanana kadar engelleyecektir. ( awaitBeklenebilir modeli uygulayan diğer türleri açabilirsiniz, ancak Task<T>en sık kullandığınız türdür .)
Bu ikili sarma / sarmalama, eşzamansızın bu kadar birleştirilebilir olmasını sağlayan şeydir. Örneğin, sizinkini çağıran ve sonucu ikiye katlayan başka bir zaman uyumsuz yöntem yazabilirim:
public async Task<int> AccessTheWebAndDoubleAsync()
{
var task = AccessTheWebAsync();
int result = await task;
return result * 2;
}
(Ya da sadece return await AccessTheWebAsync() * 2;elbette.)
asyncanahtar kelimeye göre hallettiğini varsayıyorum .