2011-12-09 11 views
8

क्या पहले await से पहले एसिंक विधि की शुरुआत में महंगा कोड होना बुरा है? क्या इस कोड को TaskEx.Run के साथ लपेटा जाना चाहिए?क्या पहले 'प्रतीक्षा' से पहले async विधियों में महंगा कोड हो सकता है?

public async Task Foo() 
{ 
    // Do some initial expensive stuff. 
    // ... 

    // First call to an async method with await. 
    await DoSomethingAsync; 
} 
+0

क्या आप एक उदाहरण छद्म कोड कर सकते हैं? – vcsjones

उत्तर

10

रीड कहते हैं, यह वास्तव में संदर्भ पर निर्भर करता है। कोड को पर बिंदु पर चलाना है - लेकिन संदर्भ के आधार पर, यह कुछ महत्वपूर्ण लोगों के बजाय थ्रेड पूल थ्रेड पर चल रहा है।

बल्कि Task.Run का उपयोग करने से, मैं TaskEx.Yield का उपयोग करेंगे: जहां तक ​​मुझे पता है हूँ

public async Task Foo() 
{ 
    await TaskEx.Yield(); 
    // Do expensive stuff 
} 

, कि मूल रूप से तुरंत करने के लिए फोन करने वाले की ओर लौटने, लेकिन अनुमति देता है async विधि के बाकी का एक तरीका है सीधे निर्धारित किया जाना चाहिए। यदि आप विंडोज फॉर्म यूआई थ्रेड की तरह कुछ हैं, तो ऐसा करने में कोई बात नहीं है क्योंकि आप यूआई थ्रेड (और वहां महंगी कोड चला रहे हैं) पर वापस आ जाएंगे - लेकिन यदि आप किसी संदर्भ में हैं तो यह समझ में आएगा जहां वर्तमान धागा अवरुद्ध नहीं किया जाना चाहिए, लेकिन निरंतरता किसी अन्य धागे पर चलती है।

5

यह आवश्यक नहीं है, लेकिन यह अप्रत्याशित परिणाम हो सकता है। अगर कॉलर उम्मीद करता है कि कोड पूरी तरह से असंकालिक रूप से व्यवहार करेगा, तो महंगा कोड सिंक्रनाइज़ हो जाएगा। इससे यह एक सिंक्रोनस विधि की तरह आंशिक रूप से व्यवहार करने का कारण बनता है, लेकिन असीमित रूप से, जो कि दोनों दुनिया के सबसे बुरे प्रकार (प्रतिकृति के बिना एसिंक्रोनि से अतिरिक्त जटिलता ...)

यदि संभव हो, तो मैं अनुशंसा करने की अनुशंसा करता हूं पहले इंतजार के लिए अग्रणी "महंगा" कोड के रूप में। महंगा कोड लपेटने के लिए Task.Run (या TaskEx.Run) का उपयोग करके, या महंगी कोड को अपनी स्वयं की असीमित विधि में ले जाना (जिस पर आप await कर सकते हैं) इस मामले में फायदेमंद होगा।