दिलचस्प पोस्ट
तत्वों को एक सामान्य सूची से कैसे हटाएं, जबकि इसे खत्म करना है? एंड्रॉइड – क्या नेविगेशन ड्रॉवर दाएं हाथ से संभव है? जावा में थ्रेड सुरक्षित मल्टीटाउन मुझे "char * s" के साथ आरंभ करने वाले स्ट्रिंग पर लिखे जाने पर "चार्ल्स " क्यों नहीं है, मुझे एक विभाजन त्रुटि क्यों मिली? मैं प्रिंटर पर एक फ़ाइल दस्तावेज़ कैसे भेज सकता हूं और इसे प्रिंट कर सकता हूं? सीएसएस जब इनलाइन ब्लॉक तत्वों लाइन-ब्रेक, माता-पिता आवरण नई चौड़ाई फिट नहीं है कैसे एक क्वेरी स्ट्रिंग के भीतर एक सरणी को पारित करने के लिए? सेट विंडोज प्रक्रिया (या उपयोगकर्ता) स्मृति सीमा जावा सॉकेट / सीरियललाइज़ेशन, ऑब्जेक्ट अपडेट नहीं होगा टेम्पलेट सहायक के अंदर उल्का पद्धतियों का उपयोग कैसे करें ग्राफ पर प्रतिगमन रेखा समीकरण और आर 2 जोड़ना mmap () बनाम पढ़ने के ब्लॉक JavaScript में डबल या एकल उद्धरणों का उपयोग कब करना है? डीएलएल निर्भरता की जांच कैसे करें? अपने सभी बच्चों सहित एक शाखा रिबसिंग

थ्रेड क्यों है। इतनी हानिकारक सो जाओ

मैं अक्सर इसे देखते हैं कि Thread.Sleep(); का उपयोग नहीं किया जाना चाहिए, लेकिन मुझे समझ में नहीं आ रहा है कि ऐसा क्यों है। यदि Thread.Sleep(); परेशानी का कारण बन सकता है, क्या कोई भी वैकल्पिक समाधान समान परिणाम के साथ सुरक्षित होगा?

जैसे।

 while(true) { doSomework(); i++; Thread.Sleep(5000); } 

दूसरा एक है:

 while (true) { string[] images = Directory.GetFiles(@"C:\Dir", "*.png"); foreach (string image in images) { this.Invoke(() => this.Enabled = true); pictureBox1.Image = new Bitmap(image); Thread.Sleep(1000); } } 

वेब के समाधान से एकत्रित समाधान "थ्रेड क्यों है। इतनी हानिकारक सो जाओ"

Thread.Sleep को बुलाए Thread.Sleep की समस्याएं। Thread.Sleep को काफी संक्षेप में यहां समझाया गया है :

Thread.Sleep का इसका उपयोग होता है: एक एमटीए थ्रेड पर परीक्षण / डीबगिंग करते समय लंबा संचालन का अनुकरण। .NET में इसका उपयोग करने के लिए कोई अन्य कारण नहीं है।

Thread.Sleep(n) अर्थ है वर्तमान धागा को कम से कम टाइम्स लिसेस (या थ्रेड क्वांटम) की संख्या जो कि n मिलीसेकंड्स के भीतर हो सकती है। टाइमस्लाइस की लंबाई अलग-अलग संस्करणों / प्रकार के विंडोज और अलग-अलग प्रोसेसर पर भिन्न होती है और आमतौर पर 15 से 30 मिलीसेकेंड तक होती है। इसका मतलब यह है कि धागे लगभग n मिलीसेकंड से अधिक के लिए ब्लॉक की गारंटी है। संभावना है कि आपका धागा n मिलीसेकंड के बाद ठीक-ठाक हो जाएगा जितना असंभव है उतना असंभव हो सकता है। तो, Thread.SleepThread.Sleep समय के लिए व्यर्थ है

धागे एक सीमित संसाधन हैं, वे लगभग 200,000 चक्रों को बनाने और नष्ट करने के लिए लगभग 100,000 चक्र लेते हैं। डिफ़ॉल्ट रूप से वे अपनी स्टैक के लिए 1 मेगाबाइट की आभासी स्मृति आरक्षित करते हैं और प्रत्येक संदर्भ स्विच के लिए 2,000-8000 चक्र का उपयोग करते हैं। यह किसी भी प्रतीक्षा थ्रेड को एक विशाल कचरा बनाता है।

पसंदीदा समाधान: प्रतीक्षाहैंडल

सबसे ज्यादा गलती Thread.Sleep का उपयोग कर Thread.Sleep है। थोड़ी देर के निर्माण के साथ Thread.Sleep ( डेमो और उत्तर , अच्छा ब्लॉग प्रविष्टि )

संपादित करें:
मैं अपना जवाब बढ़ाना चाहता हूं:

हमारे पास 2 भिन्न उपयोग-मामले हैं:

  1. हम इंतजार कर रहे हैं क्योंकि हमें एक विशिष्ट समय अवधि पता है जब हमें जारी रखना चाहिए ( Thread.Sleep उपयोग करें। Thread.Sleep , Thread.SleepThread.SleepThread.Sleep या एलेक्स)

  2. हम इंतजार कर रहे हैं क्योंकि कुछ स्थिति कुछ समय बदलती है … खोजशब्द (ओं) कुछ समय है / है! यदि कंडीशन-चेक हमारे कोड-डोमेन में है, तो हमें प्रतीक्षाहैंडल का उपयोग करना चाहिए – अन्यथा बाहरी घटक को किसी तरह का हुक प्रदान करना चाहिए … अगर इसकी डिज़ाइन खराब नहीं है!

मेरा उत्तर मुख्य रूप से उपयोग-केस 2 को शामिल करता है

SCENARIO 1 – async कार्य पूर्ण होने के लिए प्रतीक्षा करें: मैं सहमत हूं कि WaitHandle / Auto | ManualResetEvent का उपयोग परिदृश्य में किया जाना चाहिए जहां एक थ्रेड कार्य पूरा करने के लिए दूसरे थ्रेड पर प्रतीक्षा कर रहा है।

SCENARIO 2 – समय के दौरान लूप: हालांकि, क्रूड समय सारणी तंत्र (जबकि + थ्रेड। नींद) के रूप में 99% अनुप्रयोगों के लिए पूरी तरह से ठीक है, जिसको अवरुद्ध थ्रेड को "wake up। थ्रेड बनाने के लिए 200k चक्र भी अमान्य हैं – टाइमिंग पाश धागा वैसे भी बनाया जाना चाहिए और 200k चक्र केवल एक और बड़ी संख्या है (मुझे बताइए कि फ़ाइल / सॉकेट / डीबी कॉल्स कैसे खोलें?)

तो जब + थ्रेड। नींद काम करता है, तो चीजों को मुश्किल क्यों है? केवल वाक्यविन्यास वकीलों, व्यावहारिक होगा !

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

सी # दुनिया में मेरे कुछ अन्य पसंदीदा पसंदीदा तथ्य यह है कि वे आपको "कभी लॉक (इस) कॉल नहीं" या "जीसी कॉल नहीं करते हैं। इन दोनों को कई ब्लॉगों और आधिकारिक दस्तावेजों में जबरदस्ती घोषित किया गया है, और आईएमओ पूर्ण गलत सूचना है। कुछ स्तरों पर यह गलत सूचना अपने उद्देश्य को पूरा करती है, इससे पहले कि शुरुआती चीजों को वे पूरी तरह से विकल्पों पर शोध करने से पहले नहीं समझने से रोकते हैं, लेकिन साथ ही, खोज इंजन के माध्यम से वास्तविक जानकारी ढूंढना मुश्किल होता है लगता है कि आपको कुछ नहीं करने वाले लेखों पर ध्यान देना चाहिए, जबकि सवाल का कोई जवाब नहीं दे रहा है "क्यों नहीं?"

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

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

यह है 1)। स्पिनिंग और 2) आपके उदाहरणों का चलन पाश जो लोगों के विरुद्ध सावधानी बरतने के लिए नहीं, थ्रेड। नींद () भाग। मुझे लगता है कि थ्रेड। नींद () आमतौर पर कताई या पोलिंग लूप में आसानी से सुधारने के लिए जोड़ दी जाती है, इसलिए यह सिर्फ "खराब" कोड से जुड़ा है

इसके अलावा लोगों की तरह सामान करते हैं:

 while(inWait)Thread.Sleep(5000); 

जहां वेरिएबल inWait को थ्रेड्स-सुरक्षित तरीके से एक्सेस नहीं किया जाता है, जिससे समस्याएं भी हो सकती हैं।

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

जैसा कि एंड्रियास एन ने उल्लेख किया, जो अल्बाड़ी द्वारा सी # में थ्रेडिंग पढ़ा, यह वास्तव में बहुत अच्छा है

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

मैं यहां कई लोगों से सहमत हूं, लेकिन मुझे यह भी लगता है कि यह निर्भर करता है।

हाल ही में मैंने यह कोड दिया था:

 private void animate(FlowLayoutPanel element, int start, int end) { bool asc = end > start; element.Show(); while (start != end) { start += asc ? 1 : -1; element.Height = start; Thread.Sleep(1); } if (!asc) { element.Hide(); } element.Focus(); } 

यह एक सरल एनीमेट फंक्शन था, और मैंने Thread.Sleep इस्तेमाल Thread.Sleep पर Thread.Sleep

मेरा निष्कर्ष, अगर यह काम करता है, तो इसका उपयोग करें

उन लोगों के लिए जिन्होंने थ्रेड के उपयोग के खिलाफ एक वैध तर्क नहीं देखा है। SCENARIO 2 में सो जाओ, वास्तव में एक है – आवेदन बाहर निकलने के समय में लूप तक रखा जाना (SCENARIO 1/3 केवल सादे बेवकूफ है जो अधिक योग्य नहीं है उल्लेख)

बहुत-से लोग जानते हैं, जो थ्रेड को चिल्लाने के लिए डरे हुए हैं। नींद बुरी बात उन लोगों के लिए एक वैध कारण का उल्लेख नहीं कर पाई है जिन्होंने इसे प्रयोग नहीं करने के एक व्यावहारिक कारण की मांग की – लेकिन यहाँ यह है, पीट – थ्रेड के लिए धन्यवाद। नींद बुराई है (आसानी से एक टाइमर / हैंडलर से बचा जा सकता है)

  static void Main(string[] args) { Thread t = new Thread(new ThreadStart(ThreadFunc)); t.Start(); Console.WriteLine("Hit any key to exit."); Console.ReadLine(); Console.WriteLine("App exiting"); return; } static void ThreadFunc() { int i=0; try { while (true) { Console.WriteLine(Thread.CurrentThread.ThreadState.ToString() + " " + i); Thread.Sleep(1000 * 10); i++; } } finally { Console.WriteLine("Exiting while loop"); } return; }