2013-03-16 5 views
9

मैं दो निम्न विधियोंक्या विधि है जो कार्य प्राप्त करती है और इसे दूर करती है, इसका इंतजार करना चाहिए?

public async Task<bool> DoSomething(CancellationToken.token) 
{ 
    //do something async 
} 

//overload with None token 
public /*async*/ Task<bool> DoSomething() 
{ 
    return /*await*/ DoSomething(CancellationToken.None); 
} 

दूसरी विधि async के साथ चिह्नित किया जाना चाहिए है/कीवर्ड्स का इंतजार है या नहीं?

उत्तर

12

यदि आपको दूसरी विधि में प्रतीक्षा/एसिंक का उपयोग करने की आवश्यकता नहीं है, तो आप अतिरिक्त ओवरहेड जोड़ देंगे जो इस मामले में कुछ भी नहीं पूरा करता है।

DoSomething(CancellationToken) के अंदर async काम पहले से ही आपके लिए मौजूदा संदर्भ में उचित एसिंक्रोनस हैंडलिंग और मार्शलिंग प्रदान करेगा।

दिन के अंत में, async और await वास्तव में केवल भाषा विशेषताएं हैं जो Task बनाने और लिखने में आसान बनाती हैं। यदि आपके पास पहले से ही Task वापस लौटने के लिए एक अच्छा अच्छा है, तो इसे अनदेखा करने के लिए अतिरिक्त भाषा समर्थन का उपयोग करने की आवश्यकता नहीं है और इसे नए Task में दोबारा दोहराएं।

+0

यदि मैं विधि को एसिंक के रूप में चिह्नित करता हूं, और लौटने से पहले प्रतीक्षा करता हूं, तो वापसी से ठीक पहले मैं कुछ शॉर्टरकिट कोड लिख सकता हूं जैसे "अगर (कुछ कंडिशन) झूठी वापसी" .. async कीवर्ड के बिना यह संभव नहीं है क्योंकि यह शिकायत करता है रिटर्न टाइप मिस्चैच ... आप इस मामले में क्या सलाह देंगे? कार्य का प्रयोग करें। FromResult ?? या इस मामले में एसिंक को लपेटने का इंतजार है? – labroo

+2

@labroo मैं शायद इस मामले में "कार्य। FromResult" का उपयोग करेंगे। – hazzik

11

रीड की अच्छा जवाब देने के लिए इस तरह से जोड़ने के लिए, इसके बारे में सोचो करने के लिए:

Func<int, int> GetFunc() 
{ 
    Func<int, int> f = GetFunc(someParameter); 

आप कहना चाहिए

return f; 

या कारण "मैं यहाँ एक समारोह लौटने होना चाहिए हूँ, तो चलो चलो एक लैम्ब्डा बनाएं जो मेरे पास मजेदार है ":

return (int i) => f(i); 

मुझे उम्मीद है कि आप पूर्व करेंगे; आपके पास पहले से Func<int, int> है, इसलिए बस इसे वापस करें। एक func मत करो जो एक func कहते हैं।

IEnumerable<int> GetSequence() 
{ 
    IEnumerable<int> sequence = GetSequence(someParameter); 

आप कह सकते हैं कि यदि आप था

return sequence; 

या

foreach(int item in sequence) yield return item; 

? दोबारा, मुझे उम्मीद है कि आप पूर्व करेंगे। आपके पास एक अनुक्रम है, तो एक नया अनुक्रम बनाने की सभी परेशानी क्यों करें जो पुराने को बताती है?

वही कार्यों के लिए जाता है; जैसे आप एक प्रतिनिधि बना सकते हैं जो एक और प्रतिनिधि को लपेटता है और एक अनुक्रम जो दूसरे अनुक्रम को लपेटता है, आप एक ऐसा कार्य कर सकते हैं जो किसी अन्य कार्य को लपेटता है, लेकिन आप क्यों? यह सिर्फ संसाधनों का अपशिष्ट है।

+0

दिलचस्प बात यह है कि रीशेपर कोड (और स्वचालित रूप से सही करने की पेशकश) का पता लगाएगा जो कि उन दोनों गलतियों में से एक बनाता है। मुझे यकीन नहीं है कि क्या यह ओपी के मामले का पता लगाएगा। – Brian

+3

@ ब्रायन: दिलचस्प। उत्तरार्द्ध मामला तर्कसंगत रूप से एक बग नहीं है क्योंकि इसका प्रभाव है; सबसे पहले, यह सुनिश्चित करता है कि परिणामी अनुक्रम में स्रोत अनुक्रम के साथ संदर्भित पहचान नहीं है, और दूसरा, यह सुनिश्चित करता है कि दूसरा अनुक्रम * केवल पढ़ने के लिए * स्रोत अनुक्रम नहीं है। –

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