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 async
bir 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>
( T
zaman 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
- int
gerçek yöntem, await
henü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 await
tersini yapar - bu unwraps bir Task<T>
a T
bu hat işliyor değeri:
string urlContents = await getStringTask;
... ama tabii ki eşzamansız olarak açıyor, oysa sadece kullanmak Result
görev tamamlanana kadar engelleyecektir. ( await
Beklenebilir 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.)
async
anahtar kelimeye göre hallettiğini varsayıyorum .