Async / Await बनाम थ्रेड्स


100

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

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

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

2
मुझे लगा कि Async / Await वही कर रहा है जो new Thread(() => {Some Work}).Start();वह कर रहा है! है ना?
रोमन रत्स्की

2
नहीं। आपकी धारणा सही नहीं है। आप Task.Run (TPL) के बारे में सोच रहे होंगे , जिसे अक्सर Async / Await के साथ जोड़ा जाता है, लेकिन यह भी असंबंधित है और इसे इसके साथ उपयोग करने की आवश्यकता नहीं है।
dtb

4
@dtb: तो Async / Await का उपयोग कब करना है और थ्रेड का उपयोग कब करना है मैं Task.Run, Thread.Start, Async / Await के बीच अंतर के बारे में वास्तव में उलझन में हूं। यदि आप मुझे एक अच्छी व्याख्या प्रदान कर सकते हैं जो मुझे उनके बीच के अंतरों को समझने में मदद करता है तो मैं बहुत ही आभारी
रहूंगा

2
Async / wait थ्रेड का उपयोग करें या किसी अन्य तरीके से नहीं बनाता है।
wRAR

जवाबों:


79

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

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

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

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

केवल WebClient.DownloadStringAsync जैसी कुछ विधियों के साथ उपयोग किया जा सकता है

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


4
आधुनिक C # पहलू में बाहरी API पर Async-Callbacks प्राप्त करने का सबसे अच्छा तरीका क्या है?
bonCodigo

5
अंतिम पैराग्राफ में कवर किया गया, एक कार्य का उपयोग करें।
हंस पासेंट

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

1
क्या आप "एक धागा कई और उपयोगी चीजें कर सकते हैं" पर विस्तार कर सकते हैं? यह उन सुविधाओं को समझने के लिए उपयोगी होगा जो थ्रेड प्रदान करते हैं जो इसके asyncलिए अनुपयुक्त है।
बेंजोय

1
await Task.Runसीपीयू-बाउंड कार्य के लिए वर्थ उल्लेख । अगर मैं सही ढंग से समझूं, तो कभी-कभी यह सिद्ध होता है कि कोई व्यक्ति एक धागा या पृष्ठभूमि का काम करने वाले को क्या करेगा।
टूलमेकरसैट

15

इस पर आधिकारिक बयान। यद्यपि आपको दूसरों के साथ एक चीज को नेत्रहीन रूप से बदलने से पहले थ्रेड्स और अतुल्यकालिक प्रोग्रामिंग के बीच के अंतर को समझना चाहिए।


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

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

1
अफसोस की बात है, आधिकारिक बयान यह नहीं समझाता है कि कब करना है await Task.Run। कार्य का एक संक्षिप्त उल्लेख है। लेकिन, यह स्पष्ट नहीं है। लब्बोलुआब यह है कि awaitअपने आप में समानांतर रूप से एक सीपीयू-बाउंड कार्य नहीं किया जाएगा, इसलिए इस तरह के काम के माध्यम से किया जाना चाहिए await Task.Run
टूलमेकरसैट

2

मैं इसके बारे में इस तरह से सोचता हूं (और मुझे लगता है कि अगर आप https://docs.microsoft.com/en-us/prepret-versions/visualstudio/visual-studio-2012/hh191443(v=v=.110 पर देखें तो Microsoft भी ऐसा ही करता है। ) # धागे )

Async / wait मुख्य एप्लिकेशन थ्रेड पर कुछ कोड चलाने के लिए एक त्वरित तरीका है जिसके लाभ से कोड स्वयं को निलंबित कर सकता है जब उसके पास मुख्य थ्रेड पर "वेक अप" करने के लिए मुख्य थ्रेड पर "वेक अप" करने के लिए कोई काम नहीं होता है। प्राप्त करने के लिए एक परिणाम है और फिर प्रसंस्करण वापस पास करें - आपने अनुमान लगाया - मुख्य धागा। इसे बेसिक में एक घटना आधारित GOTO स्टेटमेंट की तरह समझें जो निष्पादन की एक विशिष्ट रेखा के आगे और पीछे नियंत्रण को पारित कर सकता है।

इसके विपरीत एक थ्रेड निष्पादन की एक अलग धारा है जो अपने स्वयं के चर आदि के साथ चल सकती है, जहां - पर्याप्त हार्डवेयर - निष्पादन मुख्य थ्रेड के समानांतर होता है।

यदि आपके पास एक GUI एप्लिकेशन है जो किसी एकल फ़ाइल को डाउनलोड करने के लिए जा रहा है और फिर डाउनलोड होने पर उस फ़ाइल के साथ कुछ करें - मैं एक async / प्रतीक्षा विधि का उपयोग करके इसे लागू करूंगा।

हालाँकि, अगर आपके GUI को 5000 फाइलें डाउनलोड करने की आवश्यकता है - मैं संभाल करने के लिए एक फ़ाइल डाउनलोड थ्रेड बनाऊंगा, क्योंकि फाइलों को डाउनलोड करने के लिए मुख्य GUI थ्रेड फ्रीज हो सकता है जबकि निष्पादन स्थानांतरित हो जाता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.