2012-12-20 26 views
11

मैं निम्नलिखित कोड है:Async lambda अभिव्यक्ति प्रतीक्षा रिटर्न कार्य के साथ?

  // Get all of the files from the local storage directory. 
     var files = await folder.GetFilesAsync(); 

     // Map each file to a stream corresponding to that file. 
     var streams = files.Select(async f => { return await f.OpenStreamForWriteAsync(); }); 

मैं streams प्रकार IEnumerable<Stream> के होने की अपेक्षा करेंगे लेकिन वास्तव में यह IEnumberable<Task<Stream>> की है, जो है जो मैं उम्मीद गए हैं मैं इंतजार कीवर्ड लोप था। OpenStreamForWriteAsync का रिटर्न प्रकार Task<Stream> है - निश्चित रूप से इसका इंतजार करना चाहिए कि इसे Stream बनाना चाहिए?

तो, वापसी कार्य वापस लौटने का इंतजार क्यों है?

आपकी मदद के लिए धन्यवाद।

+2

async विधियां हमेशा 'कार्य ' या 'कार्य 'वापस लौटाती हैं। खुद का चयन करें रिटर्न प्रकार की परवाह नहीं है। तो यह एक संख्यात्मक कार्य प्रोजेक्ट करता है क्योंकि आपका चयन लैम्ब्डा एसिंक है। आप अपने संग्रह पर फिर से शुरू कर सकते हैं और स्ट्रीम का इंतजार कर सकते हैं। – vcsjones

+0

ठीक है, कोई भी "एसिंक शून्य" विधि लिख सकता है, जो मैंने अनुमान लगाया है वह यहां हो रहा था। मैं इसे कैसे ठीक करूं? –

+0

ठीक है मैं कोशिश करूँगा। –

उत्तर

9

सभी async विधियां या तो void, Task, या Task<TResult> वापस लौटें। लैम्ब्डा सिर्फ एक अज्ञात विधि है, और इस प्रकार यह अभी भी लागू होता है। यह अनिवार्य रूप से इस नाम पर रखा गया पद्धति के रूप में एक ही है:

private static async Task<Stream> Foo(TypeGOesHere f) 
{ 
    return await f.OpenStreamForWriteAsync(); 
} 

आदेश में इसे वापस एक Stream यह एक अवरुद्ध विधि के बजाय एक async विधि की आवश्यकता होगी बनाने के लिए:

private static Stream Foo(TypeGOesHere f) 
{ 
    return f.OpenStreamForWriteAsync().Result; 
} 

आप शायद डॉन ' टी चाहता हूँ।

आप बदल सकते हैं अपने IEnumerable<Task<Stream>> एक Task<Stream[]> में Task.WhenAll का उपयोग कर कि यदि आप में मदद करता है के द्वारा:

Task<Stream[]> resultTask = Task.WhenAll(streams); 
+0

या, बेहतर, संलग्नक एसिंक को संलग्न करें और 'var streams = files का उपयोग करें। चयन करें (f.OpenStreamForWriteAsync()) का इंतजार करें; '। यह लैम्ब्डा नहीं है जिसे एसिंक संशोधक होना चाहिए। – shipr

0

wouldnt इस सबसे अच्छा समाधान हो सकता है?

 // Get all of the files from the local storage directory. 
    var files = await folder.GetFilesAsync(); 

    // Map each file to a stream corresponding to that file and await the Task that waits for all tasks to complete? maybe thats whats being implied above... 
    var streams = await Task.WhenAll(files.Select(async f => { return await f.OpenStreamForWriteAsync(); })); 
संबंधित मुद्दे