मुझे एक मौजूदा कार्यक्रम को संशोधित करने की आवश्यकता है और इसमें निम्नलिखित कोड शामिल हैं:
var inputs = events.Select(async ev => await ProcessEventAsync(ev))
.Select(t => t.Result)
.Where(i => i != null)
.ToList();
लेकिन यह मेरे लिए बहुत ही अजीब लगता है, सबसे पहले async
और await
चयन में। स्टीफन क्लीरी के इस जवाब के अनुसार मुझे उन्हें छोड़ देना चाहिए।
फिर दूसरा Select
जो परिणाम का चयन करता है। क्या इसका मतलब यह नहीं है कि कार्य बिल्कुल भी समान नहीं है और इसे सिंक्रोनाइज़ किया जाता है (कुछ भी नहीं करने के लिए बहुत अधिक प्रयास), या कार्य को एसिंक्रोनस रूप से निष्पादित किया जाएगा और जब यह किया जाता है तो बाकी क्वेरी निष्पादित होती है?
क्या मुझे स्टीफन क्लीरी के एक अन्य उत्तर के अनुसार उपरोक्त कोड लिखना चाहिए :
var tasks = await Task.WhenAll(events.Select(ev => ProcessEventAsync(ev)));
var inputs = tasks.Where(result => result != null).ToList();
और क्या यह पूरी तरह से ऐसा ही है?
var inputs = (await Task.WhenAll(events.Select(ev => ProcessEventAsync(ev))))
.Where(result => result != null).ToList();
जबकि मैं इस परियोजना पर काम कर रहा हूँ, मैं पहले कोड के नमूने को बदलना चाहता हूँ, लेकिन मैं बहुत ज्यादा नहीं हूँ (स्पष्ट रूप से काम कर रहा)। शायद मैं कुछ भी नहीं के लिए चिंता कर रहा हूँ और सभी 3 कोड नमूने बिल्कुल एक ही काम करते हैं?
ProcessEventsAsync इस तरह दिखता है:
async Task<InputResult> ProcessEventAsync(InputEvent ev) {...}
Task<InputResult>
साथ InputResult
एक कस्टम वर्ग जा रहा है।
Select
अपने कार्यों से पहले के परिणामों को भूल गए हैं Where
।
Result
काम की संपत्ति तक पहुँचने के परिणाम