2015-10-26 11 views
5

मैं कठिन रास्ता है कि एक पूल धागे से Task.Wait बुला धागे की भुखमरी गतिरोध का कारण बन सकता सीखा है।कार्य करना चाहिए। प्रतीक्षा बहिष्कृत की जानी चाहिए?

this MSDN article के अनुसार

, अध्याय 'गतिरोध' में, हम इन दो नियमों का पालन करना चाहिए:

  • , किसी भी वर्ग जिसका तुल्यकालिक तरीकों अतुल्यकालिक कार्यों के लिए इंतजार नहीं बना है के बाद से इस वर्ग पर एक धागे से कहा जा सकता है तालाब। वर्ग ब्लॉक अतुल्यकालिक कार्यों के लिए इंतजार करता है, तो
  • एक अतुल्यकालिक समारोह के अंदर किसी भी वर्ग का प्रयोग न करें।

ऐसा लगता है केवल जगह Task.Wait के एक वैध उपयोग के लिए छोड़ दिया है मुख्य कार्य है - मैं यहाँ एक सा अतिशयोक्ति रहा हूँ, लेकिन आप विचार मिलता है।

क्यों Task.Wait अभी भी नेट ढांचे का हिस्सा है, देखकर यह कितना खतरनाक है?

उत्तर

5

क्यों Task.Wait अभी भी नेट ढांचे का हिस्सा है, को देखने के लिए कि यह कैसे खतरनाक है?

क्योंकि आप Task पर सिंक्रनाइज़ रूप से अवरुद्ध करने में सक्षम होना चाहते हैं। शायद ही कभी, लेकिन आप अभी भी करते हैं। जैसा कि आपने कहा था, Main शायद सबसे लोकप्रिय (और अधिमानतः केवल एकमात्र) जगह है जहां ऐसा होगा। यही कारण है, और तथ्य यह है कि माइक्रोसॉफ्ट कुख्यात है यह पीछे की ओर संगतता है के लिए है, तो एक बार इस पेश किया गया था, यह अत्यधिक पदावनत या बीसीएल से गायब होने की संभावना नहीं है। Task.WaitAll के लिए ही चला जाता है।

वास्तविक समस्या आईएमओ तब शुरू होता है जब लोग दस्तावेज़ को सही तरीके से नहीं पढ़ते हैं और इस तरह की विधि को कॉल करने के प्रभाव को समझते हैं और इसका दुरुपयोग करते हैं। यदि आप इसे सावधानीपूर्वक उपयोग करते हैं, तो यह बहुत अच्छा काम करता है।


एक और बात यह है कि आप हमेशा नहीं जा सकते सभी तरह async है। दुर्भाग्यवश, आपके पास कई बार कोड है, जो हस्ताक्षर द्वारा तुल्यकालिक है, जिसे बदला नहीं जा सकता है और उसे एसिंक विधि कॉल का आह्वान करने की आवश्यकता है। हां, यह सभी के द्वारा खतरनाक और निराश है और इसे anti-pattern with async code माना जाता है, और मैंने स्वयं को SO पर कम से कम एक दर्जन प्रश्न का उत्तर दिया है, जहां लोग खुद को डेडलॉकिंग करते हैं और समझ में नहीं आते हैं, लेकिन टीपीएल लेखकों को अभी भी इन प्रकारों को बनाने की आवश्यकता है कॉल संभव है।

+2

मैं सहमत नहीं है कि लोगों को ठीक से कि विशेष मामले में दस्तावेज़ पढ़ नहीं है। दस्तावेज का विशाल बहुमत भ्रामक है और लोगों को विश्वास है कि कार्य को बुलाए जाने में कुछ भी गलत नहीं है। प्रतीक्षा करें, कार्य करें। किसी के अपने पैर को शूट करने के लिए कई अन्य अलग-अलग तरीके। – ZunTzu

+0

@ZunTzu प्रलेखन द्वारा मैं केवल एमएसडीएन का जिक्र नहीं कर रहा हूं। बस 'टास्क। प्रतीक्षा करें' [मैचों को लाता है] (http://stackoverflow.com/questions/13140523/await-vs-task-wait-deadlock) जो स्पष्ट रूप से आपको एसिंक कोड पर अवरुद्ध न करने के लिए कहता है। अधिक से अधिक, async-await के बारे में सीखने के लिए प्रयोग और पढ़ने की आवश्यकता होती है, और ऐसे कई ब्लॉग-पोस्ट हैं जो वास्तव में उन डेडलॉक परिदृश्यों का वर्णन करते हैं। यह जानना उपयोगकर्ता की ज़िम्मेदारी है कि वह क्या उपयोग कर रहा है और इसका उपयोग कैसे किया जाना चाहिए। मैं * सहमत हूं * एमएसडीएन दस्तावेज़ों में एसिंक ऑपरेशंस पर सिंक्रनाइज़ रूप से अवरुद्ध होने के खतरनाक खतरे के बारे में पर्याप्त जानकारी नहीं है। –

+0

प्रलेखन खतरों के बारे में अधिक स्पष्ट होना चाहिए, उदाहरण के लिए यह Thread.Abort के लिए करता है। – ZunTzu

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