सबसे अच्छा अभ्यास लूप के अंदर संग्रह में सभी async
कॉल एकत्र करना है और Task.WhenAll()
करें। फिर भी, समझना चाहते हैं कि क्या होता है जब लूप के अंदर await
का सामना करना पड़ता है, Task
में वापस क्या होगा? async
कॉल के बारे में क्या? क्या यह नए कार्यों को बनाएगा और उन्हें क्रमशः पहले से लौटाए गए Task
में जोड़ देगा?लूप के अंदर, क्या प्रत्येक एसिंक कॉल कार्य की निरंतरता का उपयोग करके लौटाए गए कार्य में बंधी जाती है?
कोड के अनुसार नीचे
private void CallLoopAsync()
{
var loopReturnedTask = LoopAsync();
}
private async Task LoopAsync()
{
int count = 0;
while(count < 5)
{
await SomeNetworkCallAsync();
count++;
}
}
चरणों मैं
LoopAsync
कहा जाता हो जाता है कर रहे हैंcount
शून्य हो जायेगा मान लिया है, जबकि पाश, हालत चेक किया गया है कोड में प्रवेश करती है
SomeNetworkCallAsync
कहा जाता है, और लौटाया गया कार्य का इंतजार है
- नई कार्य/awaitable बनाई गई है
- नई कार्य,
CallLoopAsync
()
में लौट जाता है अब प्रदान की पर्याप्त समय रहने के लिए प्रक्रिया, कैसे/की तरह किस तरह से, अगली कोड लाइनों में के लिए है count++
और आगे SomeNetworkCallAsync
निष्पादित किया जाएगा?
अपडेट - Jon Hanna और Stephen Cleary के आधार पर:
तो वहाँ एक टास्क और कहा कि टास्क के कार्यान्वयन NetworkCallAsync को 5 कॉल शामिल होगी, लेकिन एक राज्य मशीन का प्रयोग होता है इसका मतलब है उन कार्यों की जरूरत है काम करने के लिए स्पष्ट रूप से जंजीर नहीं है। यह, उदाहरण के लिए, यह तय करने की अनुमति देता है कि कार्य के परिणामस्वरूप लूपिंग को तोड़ना है या पर आधारित नहीं है, और इसी तरह।
हालांकि वे श्रृंखलित नहीं कर रहे हैं, प्रत्येक कॉल के रूप में हम इस्तेमाल किया है पूरा करने के लिए पिछले कॉल के लिए इंतजार करेंगे await
(राज्य एम/सी में, awaiter.GetResult();
)। यह बर्ताव करता है के रूप में लगातार पांच कॉल किए गए हैं, तो और वे एक के बाद एक क्रियान्वित कर रहे हैं एक और ( केवल के बाद पिछले कॉल हो जाता है पूरा)।
के बजाय लेखन
private async Task SomeWorkAsync()
{
await SomeIndependentNetworkCall();// 2 sec to complete
var result1 = await GetDataFromNetworkCallAsync(); // 2 sec to complete
await PostDataToNetworkAsync(result1); // 2 sec to complete
}
यह
private Task[] RefactoredSomeWorkAsync()
{
var task1 = SomeIndependentNetworkCall();// 2 sec to complete
var task2 = GetDataFromNetworkCallAsync()
.ContinueWith(result1 => PostDataToNetworkAsync(result1)).Unwrap();// 4 sec to complete
return new[] { task1, task2 };
}
लिखा जाना चाहिए तो: अगर यह सही है, हम कैसे हम async calls.For पूर्व रचना कर रहे हैं में थोड़ा और अधिक सावधान रहना होगा कि हम RefactoredSomeWorkAsync
समांतरता
private async Task CallRefactoredSomeWorkAsync()
{
await Task.WhenAll(RefactoredSomeWorkAsync());//Faster, 4 sec
await SomeWorkAsync(); // Slower, 6 sec
}
की संभावना के कारण 2 सेकंड तक तेज हो सकते हैं क्या यह सही है? - हाँ। के साथ-साथ "async सभी तरह", "कार्य सभी तरह संचित" अच्छी आदत है।इसी चर्चा here
मैं स्वीकार करने के लिए है कि ओपी को यह समझाने की कोशिश करते हुए, मैं बन गए हैं की जरूरत है अपने आप उलझन में। यही कारण है कि मैंने अन्य सभी पाठ को हटाने का फैसला किया। –
मेरा प्रश्न यह है कि कार्य (LoopAsync) के कार्य में विशेष रूप से चार और कुछ नेटवर्क्सकॉलएसिंक कॉल के संदर्भ में क्या होता है क्योंकि पहले लूप के दौरान नियंत्रण को कॉलर पर वापस लाया जाता है। – Saravanan