2014-04-09 6 views
19

मैं एक विधि है कि कार्यों (See my previous post about threading) की एक सरणी पैदा करता है और इस विधि मैं निम्नलिखित विकल्प हैं के अंत में:।Task.WhenAll() बनाम Task.WhenAll() का इंतजार है रुको()

await Task.WhenAll(tasks); // done in a method marked with async 
Task.WhenAll(tasks).Wait(); // done in any type of method 
Task.WaitAll(tasks); 

मूल रूप से मुझे पता है कि क्या दो whenall रों के बीच अंतर कर रहे हैं के रूप में पहले एक जब तक कार्य पूरा कर रहे हैं, जहां के रूप में एक दूसरे से करता प्रतीक्षा करने के लिए प्रतीत नहीं होता इच्छुक हूँ, लेकिन मैं एक दूसरे यदि का उपयोग करना चाहते नहीं कर रहा हूँ यह एसिंक्रोनस नहीं है।

मैं तीसरे विकल्प को शामिल किया है के रूप में मैं समझता हूँ कि इस वर्तमान धागा जब तक सभी कार्य (asynchronus का प्रतीत होता है तुल्यकालिक बजाय) प्रसंस्करण पूरा कर लिया है लॉक हो जाएगा - कृपया मुझे सही कर अगर मैं इस एक

उदाहरण के बारे में गलत हूँ इंतजार के साथ समारोह:

public async void RunSearchAsync() 
{ 
    _tasks = new List<Task>(); 
    Task<List<SearchResult>> products = SearchProductsAsync(CoreCache.AllProducts); 
    Task<List<SearchResult>> brochures = SearchProductsAsync(CoreCache.AllBrochures); 

    _tasks.Add(products); 
    _tasks.Add(brochures); 

    await Task.WhenAll(_tasks.ToArray()); 
    //code here hit before all _tasks completed but if I take off the async and change the above line to: 

    // Task.WhenAll(_tasks.ToArray()).Wait(); 
    // code here hit after _tasks are completed 
} 
+0

क्या मतलब है तुम्हारा दूसरा विकल्प async नहीं है? आपके द्वारा आग लगने वाले कार्यों को विभिन्न धागे के तहत संसाधित किया जा रहा है, प्रतीक्षा करें और प्रतीक्षा करें मुख्य धागे को प्रभावित करें। –

+0

@TMcKeown आह ठीक इसलिए मैंने सोचा कि इंतजार बिंदु भी चलाने से पहले इसे किसी भी कोड है कि बाद आया यह – Pete

+4

@Pete पर चले गए खत्म करने के लिए whenall भीतर सभी प्रक्रियाओं के लिए इंतजार करना था: "Task.WhenAll का इंतजार है" काम करना चाहिए। सुनिश्चित करें कि आप .NET 4.5 पर हैं और आपके web.config में 'targetFramework' को 4.5 पर सेट किया गया है। –

उत्तर

22

await का इंतजार है फोन करने वाले के लिए वापस आ जाएगी, और विधि निष्पादन को फिर से शुरू जब प्रतीक्षित कार्य को पूरा करता।

WhenAllपैदा करेगा एक कार्य * सभी सभी कार्य पूरा कर रहे हैं।

WaitAll निर्माण धागा (मुख्य थ्रेड) जब तक सभी कार्य पूर्ण हैं रोकेंगे।

+0

तो वहाँ इंतजार Task.WhenAll और Tasks.WhenAll() के बीच कोई अंतर होना चाहिए। रुको() whenall में सभी कार्य पूर्ण नहीं करने तक के रूप में दोनों का इंतजार करना चाहिए (क्योंकि यह नया कार्य पैदा करेगा और उसके बाद नए कार्य का इंतजार पूरा कर लिया है) अभी तक मेरे संपादन के अनुसार मैं और अधिक एक WaitAll – Pete

+1

की तरह बाद के अभिनय के साथ उन दोनों के बीच अलग व्यवहार कर अपने इंतजार से 'WhenAll()' लौटे काम वस्तु का उपयोग नहीं करता। 'जब सभी() 'एक कार्य देता है, तो आप इसका कभी भी उपयोग नहीं करते हैं इसलिए कोई इंतजार नहीं है .. जबकि दूसरा उदाहरण आप' जब सभी()' ब्लॉक बनाते हैं। –

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