2017-05-21 17 views
6

मैं Windows Template Studio कि Build2017 में पेश किया साथ UWP एप्लिकेशन बनाया।कार्य का इंतजार है। क्या पूरा करने के लिए कॉम्प्लेटेड टास्क?

नीचे कक्षा से उत्पन्न कोड का एक हिस्सा है।

public class SampleModelService 
{ 
    public async Task<IEnumerable<SampleModel>> GetDataAsync() 
    { 
     await Task.CompletedTask; // <-- what is this for? 
     var data = new List<SampleModel>(); 

     data.Add(new SampleModel 
     { 
      Title = "Lorem ipsum dolor sit 1", 
      Description = "Lorem ipsum dolor sit amet", 
      Symbol = Symbol.Globe 
     }); 

     data.Add(new SampleModel 
     { 
      Title = "Lorem ipsum dolor sit 2", 
      Description = "Lorem ipsum dolor sit amet", 
      Symbol = Symbol.MusicInfo 
     }); 
     return data; 
    } 
} 

मेरा प्रश्न है, क्या उद्देश्य और यहाँ में await Task.CompletedTask; कोड का कारण क्या है? वास्तव में इसमें Task परिणाम प्राप्तकर्ता नहीं है।

उत्तर

9

शायद सिर्फ वहाँ यह आसान बाद के चरण इस प्रकार बुला कोड refactor करने के लिए हो रही रोकने हस्ताक्षर को बदलने के लिए बिना कॉल async कोड को लागू करने के लिए बनाने के लिए।

एक अन्य विकल्प ते विधि हस्ताक्षर से async कीवर्ड और उस लाइन को हटाने और

return Task.FromResult<IEnumerable<SampleModel>>(data); 

आप इस निर्माण क्यों दिखाई देता है जब आप उदाहरण जबकि कार्यान्वयन के लिए एक इंटरफेस की वजह से एक awaitable टास्क लौटना ही होगा किया जाएगा करने के लिए कोई async काम नहीं है।

हालांकि, इस मामले में, चूंकि यह एक टेम्पलेट है, इसलिए वे को await FetchDataFromDatabaseAsync(); जैसे कुछ के साथ बदलने की उम्मीद करते हैं। चूंकि async कीवर्ड पहले से ही है, इसलिए यह आपके स्वयं के एसिंक कॉल को लागू करने के लिए आवश्यक परिवर्तनों को कम करता है।

वैसे भी, इस के बिना इंतजार का निर्माण आप यह कर सकते हैं:

public class SampleModelService 
{ 
    public Task<IEnumerable<SampleModel>> GetDataAsync() 
    { 
     var data = new List<SampleModel>(); 

     data.Add(new SampleModel 
     { 
      Title = "Lorem ipsum dolor sit 1", 
      Description = "Lorem ipsum dolor sit amet", 
      Symbol = Symbol.Globe 
     }); 

     data.Add(new SampleModel 
     { 
      Title = "Lorem ipsum dolor sit 2", 
      Description = "Lorem ipsum dolor sit amet", 
      Symbol = Symbol.MusicInfo 
     }); 

     return Task.FromResult<IEnumerable<SampleModel>>(data); 
    } 
} 

अगर वहाँ सब पर एक टास्क वापस जाने के लिए कोई आवश्यकता (आप किसी भी async कोड नहीं है) तो बस यह पूरी तरह से हटाने के लिए है। (लेकिन फिर आपको इस विधि को कॉल करने वाले कोड को दोबारा करना होगा)

इस कोड की समीक्षा करना मुझे संदेह है कि कोई व्यक्ति विकास प्रक्रिया में बाद में एसिंक विधि को कॉल करने जा रहा है और पहले से ही यह अनुमान लगाकर कि यह विधि Task लौटाती है।

+0

"शायद सिर्फ वहाँ एक टास्क वापस जाने के लिए होने से बचने के लिए।" एसिंक विधि में वापसी के रूप में आपने जो भी फेंक दिया है, वह इसे एक कार्य में लपेट देगा, इस प्रकार यह कथन सही नहीं है। – Karolis

+0

आप सही हैं, मेरा जवाब संपादित करें। –

+0

तो हम कह सकते हैं, यह 'async' हस्ताक्षर के लिए प्लेसहोल्डर का एक प्रकार है। क्या यह सही है? – Youngjae

संबंधित मुद्दे