मैं खुद को सी # के नए इंतजार/एसिंक कीवर्ड के साथ परिचित करने की कोशिश कर रहा हूं, और मुझे कई पहलुओं को मिला है जिन्हें मैं समझ नहीं पा रहा हूं।थ्रेडिंग से प्रतीक्षा/async कितना अलग है?
की दौड़ की स्थिति के साथ शुरू करते हैं:
Stream s=... ... for(int i=0;i<100;i++) { s.WriteAsync(new byte[]{i},0,1); }
होगा के रूप में हर समय (उदाहरण के लिए फ़ाइल 12345 के बारे में ..... और न 13,254 या कुछ और) की उम्मीद इस काम करता है?
दूसरी बात यह है कि एसिंक फ़ंक्शन सिंक्रनाइज़ रूप से निष्पादित करता है यदि इसमें प्रतीक्षा ऑपरेटर नहीं है। और, माइक्रोसॉफ्ट प्रलेखन के अनुसार, async फ़ंक्शन हमेशा कॉलर थ्रेड में निष्पादित होते हैं (BeginInvoke की तुलना में)। यह मुझे 3 अगले प्रश्नों पर लाता है:
कॉलर फ़ंक्शन को रिलीज़ करने से पहले कितना एसिंक फ़ंक्शन निष्पादित किया जाता है?
async void MyAsyncFunction() { Operation1(); Operation2(); Operation3(); .... Stream s=...; await s.WriteAsync(....); }
के बारे में लेख में का इंतजार है/async कि मैं पढ़ा है, यह इंतजार है कि बिना async कार्यों ऑपरेटर ने कहा है निष्पादित क्रमिक रूप से, और async साथ/सिर पर लौटने का इंतजार है। लेकिन यह मुझ पर घबरा रहा है कि
MyAsyncFunction
हमेशा ऑपरेशन 1 निष्पादित कर सकता है ... इसे रिलीज़ करने से पहले ऑपरेशन 3await s.WriteAsync
हिट करता है।क्या होगा यदि मैं इस तरह async समारोह में
Thread.Sleep
का उपयोग करें:async void DoStuff() { Stream s=...; ... await s.WriteAsync(....); Thread.Sleep(10000); .... }
विल Thread.Sleep पूरे धागा है जिसमें यह मार डाला जाता है या सिर्फ async समारोह को ब्लॉक?
क्या होगा अगर मैं
semaphore.Wait()
एसिंक कार्यों में से एक में उपयोग करता हूं और यह एक अन्य एसिंक फ़ंक्शन द्वारा सेमाफोर को रिलीज़ होने की उम्मीद करेगा। क्या यह धागे के साथ व्यवहार करेगा, या यह डेडलॉक का कारण होगा?await
async फ़ंक्शंस के बाहर काम नहीं करता है। क्यूं कर?
आपने एक पोस्ट में बहुत से प्रश्न पूछे हैं - एक सुसंगत फैशन में उन सभी का जवाब देना मुश्किल होगा। ऐसा लगता है कि आपको वास्तव में कुछ और शोध करना चाहिए (उदाहरण के लिए विजुअल स्टूडियो असिंक होम पेज पर बहुत सारी जानकारी है) और फिर एक समय में एक विशिष्ट प्रश्न पूछें। –
उम्म। async/इंतजार _is_ थ्रेडिंग। धागे का एक और अधिक कुशल उपयोग। –
@ जॉन सैंडर्स http://msdn.microsoft.com/en-us/library/vstudio/hh191443.aspx देखें: 'async और प्रतीक्षा कीवर्ड अतिरिक्त थ्रेड बनाए जाने का कारण नहीं बनते हैं। Async विधियों को multithreading की आवश्यकता नहीं है क्योंकि एक async विधि अपने धागे पर नहीं चलती है। विधि वर्तमान सिंक्रनाइज़ेशन संदर्भ पर चलती है और विधि सक्रिय होने पर केवल थ्रेड पर समय का उपयोग करती है। –