2013-03-01 21 views
68

.Net 4.5 में माइक्रोसॉफ्ट ने एसिंक्रोनस कोडिंग को सरल बनाने के लिए नई Async/Await सुविधा जोड़ा है। हालांकि, मुझे आश्चर्य है किAsync/Await बनाम थ्रेड

  1. Async/Await पूरी तरह से Threads का उपयोग करने का पुराना तरीका जगह ले सकता है?
  2. Async/Await जो भी Thread करने में सक्षम है असीमित रूप से कर सकता है?
  3. Async/Await केवल WebClient.DownloadStringAsync जैसे कुछ तरीकों से उपयोग किया जा सकता है या क्या मैं Async/Await का उपयोग करने के लिए किसी भी सिंक्रोनस विधि को परिवर्तित कर सकता हूं और मुख्य धागे को अवरुद्ध नहीं कर सकता?
+2

थ्रेड और असिंक/Await असंबंधित विशेषताएं हैं। आप उन्हें जोड़ सकते हैं, लेकिन आपको नहीं करना है। – dtb

+1

मैंने सोचा कि Async/Await वही काम कर रहा है जो 'नया थ्रेड (() => {कुछ कार्य})। प्रारंभ करें();' कर रहा है? यही है ना ? –

+1

नहीं। आपकी धारणा सही नहीं है। आप [टास्क.रुन] (http://msdn.microsoft.com/en-us/library/hh195051.aspx) (टीपीएल) के बारे में सोच रहे होंगे, जो अक्सर असिनक/Await के साथ संयुक्त होता है, लेकिन यह भी असंबंधित है और करता है इसके साथ उपयोग नहीं किया जाना चाहिए। – dtb

उत्तर

50

क्या यह थ्रेड का उपयोग करने के पुराने तरीके को पूरी तरह से बदल सकता है?

नहीं। एक धागा कई और उपयोगी चीजें कर सकता है। Await विशेष रूप से कुछ समय लेने के लिए डिज़ाइन किया गया है, आमतौर पर एक I/O अनुरोध। I/O अनुरोध पूरा होने पर पारंपरिक रूप से कॉलबैक के साथ किया गया था। इन कॉलबैक पर निर्भर कोड लिखना काफी कठिन है, इसका इंतजार बहुत आसान है।

जो भी थ्रेड असीमित रूप से कर सकता है करने में सक्षम है?

काफी हद तक। प्रतीक्षा करें देरी से निपटने का ख्याल रखता है, यह अन्यथा ऐसा नहीं करता है जो थ्रेड करता है। प्रतीक्षा अभिव्यक्ति, प्रतीक्षा कीवर्ड के दाईं ओर क्या है, यह काम पूरा हो जाता है। आदर्श रूप से यह किसी थ्रेड का उपयोग नहीं करता है, यह एक ड्राइवर अनुरोध पोस्ट करता है और एक बार जब ड्राइवर डेटा हस्तांतरण पूरा करता है तो यह एक पूर्णता अधिसूचना कॉलबैक उत्पन्न करता है। नेटवर्किंग अब तक का सबसे आम उपयोग है, सैकड़ों मिलीसेकंड की विलंबता आम हैं और डेस्कटॉप या लैन से "क्लाउड" में चल रही सेवाओं का एक अनिवार्य दुष्प्रभाव है। ऐसी सेवाओं का उपयोग सिंक्रनाइज़ेशन से यूआई को काफी उत्तरदायी बना देगा।

केवल WebClient.DownloadStringAsync की तरह कुछ तरीकों

नहीं। आप किसी भी विधि है कि एक टास्क रिटर्न के साथ उपयोग कर सकते हैं के साथ प्रयोग किया जा सकता है। XxxxAsync() विधियां सामान्य संचालन के लिए .NET ढांचे में बस सटीक हैं जो समय लेती हैं। एक वेब सर्वर से डेटा डाउनलोड करने की तरह।

+4

आधुनिक सी # पहलू में बाहरी एपीआई पर असिंक-कॉलबैक प्राप्त करने का सबसे अच्छा तरीका क्या है? – bonCodigo

+4

अंतिम अनुच्छेद में शामिल, कार्य का उपयोग करें। –

+0

मैं ऐसा कुछ उम्मीद करूंगा जो थ्रेड कर सकता है जिसे एक उदाहरण के रूप में एसिंक प्रोग्रामिंग के माध्यम से नहीं किया जा सकता है। –

12

The official statement on this. हालांकि आप आँख बंद करके अन्य लोगों के साथ एक चीजों की जगह से पहले धागे और अतुल्यकालिक प्रोग्रामिंग के बीच मतभेदों को समझना चाहिए।

+0

यह थ्रेड और असिंक/Await के बारे में मैंने पहले संसाधन की तरह है जो स्पष्ट और संक्षेप में है। –

+0

इस उत्तर में केवल दस्तावेज़ के लिए एक लिंक है। चूंकि लिंक पुराना हो सकता है क्योंकि उत्तर पुराना हो सकता है - या इससे भी बदतर - पूरी तरह से बेकार। हम स्टैक के उपयोगकर्ताओं को लिंक के प्रासंगिक हिस्सों को सीधे उनके प्रश्न में पोस्ट करने के लिए प्रोत्साहित करते हैं। – HimBromBeere

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