क्या टास्क <> और इंट के बीच एक अंतर्निहित रूपांतरण होता है?
नहीं। यह कैसे async/ awaitकाम करता है का सिर्फ एक हिस्सा है ।
asyncवापसी के प्रकार के लिए घोषित की गई कोई भी विधि :
void (यदि संभव हो तो बचें)
Task (पूरा होने / विफलता की अधिसूचना से परे कोई परिणाम नहीं)
Task<T>( Tएक async तरीके से तार्किक परिणाम के लिए )
कंपाइलर सभी उचित रैपिंग करता है। मुद्दा यह है कि आप एसिंक्रोनस रूप से लौट रहे हैं urlContents.Length- आप विधि को केवल वापस नहीं ला सकते हैं int, क्योंकि वास्तविक विधि वापस आ जाएगी जब यह पहली awaitअभिव्यक्ति को हिट करता है जो पहले से ही पूरा नहीं हुआ है। तो इसके बजाय, यह एक रिटर्न देता है Task<int>जो पूरा हो जाएगा जब एसिंक्स विधि खुद पूरी हो जाएगी।
ध्यान दें कि awaitइसके विपरीत - यह एक मूल्य को उजागर करता Task<T>है T, जो कि यह रेखा कैसे काम करती है:
string urlContents = await getStringTask;
... लेकिन निश्चित रूप से यह इसे अतुल्यकालिक रूप से उजागर करता है, जबकि बस का उपयोग Resultकरना तब तक अवरुद्ध होता है जब तक कि कार्य पूरा नहीं हो जाता। ( awaitअन्य प्रकारों को अनचाहा कर सकते हैं जो प्रतीक्षा करने योग्य पैटर्न को लागू करते हैं, लेकिन Task<T>क्या आप अक्सर उपयोग करने की संभावना रखते हैं।)
यह दोहरी रैपिंग / अल्ट्रापॉपिंग है जो async को इतना कंपोज करने योग्य बनाता है। उदाहरण के लिए, मैं एक और async विधि लिख सकता हूं, जो आपका कॉल करता है और परिणाम को दोगुना करता है:
public async Task<int> AccessTheWebAndDoubleAsync()
{
var task = AccessTheWebAsync();
int result = await task;
return result * 2;
}
(या बस return await AccessTheWebAsync() * 2;निश्चित रूप से)
asyncकीवर्ड के आधार पर इसका ध्यान रखता है ।