2012-12-18 20 views
7

मैंने पढ़ा है कि 'पृष्ठभूमिवर्कर' designed to be replaced Ansyc/Await द्वारा है।क्या प्रतीक्षा की गई शेष विधि अतुल्यकालिक है?

क्योंकि मुझे Async/Await के संघनित रूप को पसंद है, इसलिए मैं अपने कुछ पृष्ठभूमिवर्क्सर्स को Async/Await कॉल में परिवर्तित करना शुरू कर रहा हूं।

इस कोड को मेरे पास है (यूआई से कहा जाता है) का एक उदाहरण है:

public async void RunFromTheUI() 
{ 
    await OtherAction(); 
} 

public async void OtherAction() 
{ 
    var results = await services.SomeRemoteAction(); 

    foreach (var result in results) 
    { 
     result.SemiIntenseCalculation(); 
     Several(); 
     Other(); 
     NonAsync(); 
     Calls(); 
    } 

    SomeFileIO(); 
} 

जब मैं RunFromTheUI यह लगभग तुरंत वापस आ जाएगी फोन (Async के अनुसार और प्रतीक्षा डिजाइन)।

लेकिन जब यह services.SomeRemoteAction() खत्म होने के बाद फिर से शुरू होता है तो इसे foreach लूप और अन्य विधि कॉल चलाने के लिए कॉल किया जाता है।

मेरा प्रश्न है: यदि वह लूप एक प्रदर्शन हॉग है तो यह यूआई को फ्रीज करेगा? (इससे पहले कि मैं इसे पृष्ठभूमि कार्यकर्ता थ्रेड में था, इसलिए यह यूआई को धीमा नहीं करता था)।

नोट: मैं .NET 4.0 को लक्षित कर रहा हूं और Async Nuget पैकेज का उपयोग कर रहा हूं।

+0

async/प्रतीक्षा और पृष्ठभूमिवर्कर दो अलग-अलग समस्याओं को हल करता है। बीजी कार्यकर्ता को कार्य द्वारा अधिक सटीक रूप से प्रतिस्थापित किया जाता है। Async केवल तभी प्रतिस्थापित करता है जब कार्यकर्ता निकाय कोड मूल रूप से निष्क्रिय हो जाता है, जहां बीजीडब्लू/कार्य अभी भी उपयोगी होते हैं जब आपको भारी उठाने की आवश्यकता होती है। मुझे लगता है कि आप अपने प्रश्न में सेवा परिणामों पर इंतजार कर रहे हैं, बस एफवाईआई। –

+0

1. आपका कोड संकलित नहीं होगा, आप 'async शून्य' विधि का 'इंतजार नहीं कर सकते'। 2. आपको 'async void' विधियों का उपयोग करने से बचना चाहिए, उन्हें' प्रतीक्षा 'नहीं किया जा सकता है और अपवाद को और अधिक कठिन बना दिया जा सकता है। – svick

उत्तर

6

मेरा प्रश्न है: यदि वह लूप एक प्रदर्शन हॉग है तो यह यूआई को फ्रीज करेगा?

हाँ, यह होगा। रिमोट एक्शन पूरा होने पर बाकी एसिंक विधि अभी भी यूआई थ्रेड पर निष्पादित होगी। आप ऐसा करने के लिए, नहीं करना चाहते हैं तो विकल्प हैं:

  • उपयोग ConfigureAwait(continueOnCapturedContext: false) ताकि निरंतरता यूआई धागा
  • पर निष्पादित नहीं है एक अलग सूत्र में विधि की पूरी निष्पादित Task.Run का उपयोग करके शुरू करने के लिए। (आप अभी भी यह एक async विधि बना सकता है, एक धागा अवरुद्ध से बचने के लिए जब आप की जरूरत नहीं थी।)

मूल रूप से, अगर आप या तो तुल्यकालिक, अवरुद्ध कॉल या CPU- सघन काम का भार मिल गया है , आप UI थ्रेड पर होने से बचने के लिए चाहते हैं, जो async/await के विपरीत है जो डिफ़ॉल्ट रूप से आपके लिए करता है।

+1

'टास्क.रुन' के पास' async' का उपयोग कर रहे हैं, तो 'Task.Factory.StartNew' से बेहतर डिफ़ॉल्ट है। [स्टीफन टब विवरण में जाता है।] (Http://blogs.msdn.com/b/pfxteam/archive/2011/10/24/10229468.aspx) –

+0

@ स्टीफन क्लेरी: फिक्स्ड, धन्यवाद। मैं ध्यान नहीं दे रहा था - 'टास्क। स्टार्टन्यू' निश्चित रूप से शुरू करने के लिए मान्य नहीं था :) –

+0

जॉन: एसिंक/प्रतीक्षा, कार्य को पढ़ने/समझने के लिए कोई अच्छा प्रारंभिक बिंदु? – shahkalpesh

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