क्या टास्क <> और इंट के बीच एक अंतर्निहित रूपांतरण होता है?
नहीं। यह कैसे 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
कीवर्ड के आधार पर इसका ध्यान रखता है ।