2012-11-17 13 views
20

मैं खुद को सी # के नए इंतजार/एसिंक कीवर्ड के साथ परिचित करने की कोशिश कर रहा हूं, और मुझे कई पहलुओं को मिला है जिन्हें मैं समझ नहीं पा रहा हूं।थ्रेडिंग से प्रतीक्षा/async कितना अलग है?

  1. की दौड़ की स्थिति के साथ शुरू करते हैं:

    Stream s=... 
    ... 
    for(int i=0;i<100;i++) 
    { 
        s.WriteAsync(new byte[]{i},0,1); 
    } 
    

    होगा के रूप में हर समय (उदाहरण के लिए फ़ाइल 12345 के बारे में ..... और न 13,254 या कुछ और) की उम्मीद इस काम करता है?

    दूसरी बात यह है कि एसिंक फ़ंक्शन सिंक्रनाइज़ रूप से निष्पादित करता है यदि इसमें प्रतीक्षा ऑपरेटर नहीं है। और, माइक्रोसॉफ्ट प्रलेखन के अनुसार, async फ़ंक्शन हमेशा कॉलर थ्रेड में निष्पादित होते हैं (BeginInvoke की तुलना में)। यह मुझे 3 अगले प्रश्नों पर लाता है:

  2. कॉलर फ़ंक्शन को रिलीज़ करने से पहले कितना एसिंक फ़ंक्शन निष्पादित किया जाता है?

    async void MyAsyncFunction() 
    { 
        Operation1(); 
        Operation2(); 
        Operation3(); 
        .... 
        Stream s=...; 
        await s.WriteAsync(....); 
    } 
    

    के बारे में लेख में का इंतजार है/async कि मैं पढ़ा है, यह इंतजार है कि बिना async कार्यों ऑपरेटर ने कहा है निष्पादित क्रमिक रूप से, और async साथ/सिर पर लौटने का इंतजार है। लेकिन यह मुझ पर घबरा रहा है कि MyAsyncFunction हमेशा ऑपरेशन 1 निष्पादित कर सकता है ... इसे रिलीज़ करने से पहले ऑपरेशन 3 await s.WriteAsync हिट करता है।

  3. क्या होगा यदि मैं इस तरह async समारोह में Thread.Sleep का उपयोग करें:

    async void DoStuff() 
    { 
        Stream s=...; 
        ... 
        await s.WriteAsync(....); 
        Thread.Sleep(10000); 
        .... 
    } 
    

    विल Thread.Sleep पूरे धागा है जिसमें यह मार डाला जाता है या सिर्फ async समारोह को ब्लॉक?

  4. क्या होगा अगर मैं semaphore.Wait() एसिंक कार्यों में से एक में उपयोग करता हूं और यह एक अन्य एसिंक फ़ंक्शन द्वारा सेमाफोर को रिलीज़ होने की उम्मीद करेगा। क्या यह धागे के साथ व्यवहार करेगा, या यह डेडलॉक का कारण होगा?

  5. await async फ़ंक्शंस के बाहर काम नहीं करता है। क्यूं कर?

+4

आपने एक पोस्ट में बहुत से प्रश्न पूछे हैं - एक सुसंगत फैशन में उन सभी का जवाब देना मुश्किल होगा। ऐसा लगता है कि आपको वास्तव में कुछ और शोध करना चाहिए (उदाहरण के लिए विजुअल स्टूडियो असिंक होम पेज पर बहुत सारी जानकारी है) और फिर एक समय में एक विशिष्ट प्रश्न पूछें। –

+1

उम्म। async/इंतजार _is_ थ्रेडिंग। धागे का एक और अधिक कुशल उपयोग। –

+2

@ जॉन सैंडर्स http://msdn.microsoft.com/en-us/library/vstudio/hh191443.aspx देखें: 'async और प्रतीक्षा कीवर्ड अतिरिक्त थ्रेड बनाए जाने का कारण नहीं बनते हैं। Async विधियों को multithreading की आवश्यकता नहीं है क्योंकि एक async विधि अपने धागे पर नहीं चलती है। विधि वर्तमान सिंक्रनाइज़ेशन संदर्भ पर चलती है और विधि सक्रिय होने पर केवल थ्रेड पर समय का उपयोग करती है। –

उत्तर

14

मैं आपको अपने async intro पढ़ने की सलाह देता हूं।

यह काम हर समय अपेक्षित होगा (उदाहरण के लिए फ़ाइल 12345 ..... और 13254 या कुछ नहीं)?

नहीं। आपको awaitWriteAsync पर कॉल करने की आवश्यकता है।

कॉलर फ़ंक्शन को रिलीज़ करने से पहले कितना एसिंक फ़ंक्शन निष्पादित किया जाता है?

जब तक यह await एक ऑपरेशन जो पहले से पूरा नहीं हुआ है।

थ्रेड होगा। पूरे धागे को नीला कर दें जिसमें इसे निष्पादित किया गया है या केवल एसिंक फ़ंक्शन?

Thread.Sleep - और अन्य सभी को अवरुद्ध तरीकों - async विधि और धागा है कि यह क्रियान्वित रोकेंगे।

एक सामान्य नियम के रूप में, async विधि के भीतर अवरुद्ध विधियों का उपयोग न करें।

क्या होगा अगर मैं async कार्यों में से एक में semaphore.Wait() का उपयोग करता हूं और यह एक अन्य एसिंक फ़ंक्शन द्वारा सेमाफोर को रिलीज़ होने की उम्मीद करेगा। क्या यह धागे के साथ व्यवहार करेगा, या यह डेडलॉक का कारण होगा?

यह पूरी तरह से आपके संदर्भों पर निर्भर करता है। Wait एक अवरुद्ध विधि है, इसलिए यदि "अन्य" async विधि को अवरुद्ध विधि द्वारा आयोजित संदर्भ की आवश्यकता है, तो आप डेडलॉक करेंगे।

ध्यान दें कि SemaphoreSlimasync-मित्रतापूर्ण है; आप Wait के बजाय WaitAsync का उपयोग कर सकते हैं।

प्रतीक्षा एसिंक कार्यों के बाहर काम नहीं करता है। क्यूं कर?

क्योंकि async कीवर्ड await कीवर्ड सक्षम करता है। यह सी # भाषा और कोड पठनीयता के लिए नए कीवर्ड के प्रभाव को कम करने के लिए किया गया था।

+1

+1 –

0

संक्षेप में, ऐसा लगता है कि उत्तर "बहुत" है। हालांकि निम्नलिखित आपके सभी सवालों का जवाब नहीं दे सकते हैं, मुझे लगता है कि यह एक सामान्य पर्याप्त उपयोग मामले पर लागू होता है। नेटवर्क IO के बजाए अपने स्ट्रीम के बारे में सोचें, जिसका वे उल्लेख कर रहे हैं।

ओवरलैप्ड नेटवर्क आईओ के मामले में, एक आईओ समापन बंदरगाह का उपयोग किया जाएगा, कॉलबैक हार्डवेयर इंटरप्ट द्वारा ट्रिगर किया जा रहा है।

इसका मतलब है कि जब हम पूरा होने का इंतजार कर रहे हैं, तो एक धागा का उपभोग नहीं किया जाएगा। [...]

1 धागे पर सबकुछ करना संभव है। [...] हालांकि यह प्लेटफ़ॉर्म पर निर्भर करेगा, "प्रतीक्षाकर्ता" कार्यान्वयन & सिंक्रनाइज़ेशन संदर्भ का उपयोग किया जा रहा है।

http://social.msdn.microsoft.com/Forums/en-US/async/thread/a46c8a54-f8d4-4fa9-8746-64d6a3a7540d/

+0

एमएसडीएन पर: http://msdn.microsoft। सेमफोरस्लिम के लिए कॉम/एन-यूएस/लाइब्रेरी/vstudio/hh191443.aspx # बीकेएमके_Threads –

14

आप निम्न post by Eric Lippert में await ऑपरेटर, जहां वे कहते हैं कि के बारे में अपने प्रश्नों के लिए उत्तर मिल सकता है:

"का इंतजार" ऑपरेटर ... अब मतलब यह नहीं है "इस विधि एसिंक्रोनस ऑपरेशन रिटर्न तक वर्तमान धागे को अवरुद्ध करता है "। यह एसिंक्रोनस ऑपरेशन को एक सिंक्रोनस ऑपरेशन में वापस कर देगा, जो ठीक है जिसे हम टालने का प्रयास कर रहे हैं। इसके बजाय, इसका मतलब इसके विपरीत है; इसका मतलब है "अगर हम का इंतजार कर रहे हैं, तो अभी तक पूरा नहीं हुआ है, तो इस विधि को उस कार्य की निरंतरता के रूप में साइन अप करें, और फिर तुरंत अपने कॉलर पर वापस आएं; कार्य पूर्ण होने पर निरंतरता का आह्वान करेगा। - एरिक लिपर्ट

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