2010-11-10 4 views
11

जबकि हमारे प्रोजेक्ट के कोड के माध्यम से गुजर रहा एक वेब विधि है कि यह के अंत में इस कोड था भर में आया था:बिना किसी कारण के Thread.Sleep उपयोग करने के लिए नहीं क्यों, और एक प्रोग्रामर को यह समझाने

thread.sleep(6000); 
return true; 

अब, ऐसा किया गया था इसलिए क्लाइंट से jQuery AJAX कॉल में देरी हो रही है और AJAX एनीमेशन थोड़ी देर के लिए दिखाएगा।

यह मेरी आंखों में बहुत गलत है। UI और सर्वर पक्ष के बीच इस प्रकार का कनेक्शन नहीं होना चाहिए। अगर वह एनीमेशन को अधिक समय लेना चाहता है तो वह ग्राहक पक्ष में setTimeOut फ़ंक्शन का उपयोग कर सकता है।

यहां मेरी समस्या है: मैं प्रोग्रामर को कैसे समझा सकता हूं कि यह इतना गलत क्यों है? न सिर्फ ग्राहक/सर्वर की बात, बल्कि वेबसाइट पर thread.sleep क्यों कॉल करें?

+0

व्यक्तिगत रूप से, मुझे लगता है कि आपको इस प्रश्न को [पीआर] (http://programmers.stackexchange.com) पर पूछना चाहिए। – Bobby

+0

आपका क्या मतलब है? –

+9

उसे उस एनीमेशन के बारे में बहुत गर्व होना चाहिए ** ** ** लोगों को जो भी वेबसाइट का उपयोग करने के बजाए इसे 6 सेकंड के लिए देखने के लिए मजबूर होना चाहिए। – Brad

उत्तर

16

जबकि देरी:

  • आप उपयोग कर रहे हैं/एक धागा
  • आप स्मृति उपभोग कर रहे हैं अवरुद्ध
  • आप एक खुले TCP/IP कनेक्शन

है इन पर सभी महंगा संसाधन हैं सर्वर

क्योंकि:

  • यदि कोई अन्य अनुरोध आता है, तो बाधाएं अधिक होती हैं, एक नया धागा बनाया जाना चाहिए, इसलिए यह CPU, स्मृति आदि का उपयोग करेगा, और यह इस अनुरोध को देरी करेगा। (गोटो वाक्य की शुरुआत)।
  • अधिक मेमोरी खपत का मतलब है, अधिक पेज दोष, बड़ी डिस्क कतार। सभी अनुरोधों में अधिक समय लगता है।
  • टीसीपी/आईपी कनेक्शन सीमित संसाधन हैं।
2

क्योंकि एक वेब विधि में कई उपभोक्ता हो सकते हैं, न कि वे सभी अपने डेटा में देरी करना चाहते हैं।

अद्यतन

ठीक है, अच्छी तरह से वहाँ भी पूल कि ग्राहक अनुरोधों पर कार्रवाई करेंगे में कार्यकर्ता धागे की एक सीमित संख्या है। आप उन्हें वास्तव में कुछ भी नहीं कराना चाहते हैं। डेटा के प्रदर्शन में देरी करने के लिए यह UI का एक फ़ंक्शन है, न कि वेब सेवा/पृष्ठ विधि जो डेटा प्रदान करता है। आप अपनी डेटा एक्सेस लेयर में नींद नहीं लगाएंगे, आप इसे WebMethod में क्यों रखेंगे?

+0

अच्छा .. लेकिन पर्याप्त अच्छा नहीं .. मेरा टीम-साथी मेरा तर्क देना पसंद है .. मुझे एक बेहतर स्पष्टीकरण की आवश्यकता होगी ... –

7

यह सर्वर पर कई अवरुद्ध धागे के लिए रास्ता समाप्त हो जाएगा।
आइए कहें कि आपके पास 100 अनुरोध/सेकंड हैं जिनके पास 600 धागे सो रहे हैं।
उन धागे स्टैक स्पेस में 1 एमबी रैम का उपयोग करेंगे, फिर आप 600 एमबी सर्वर रैम बर्बाद कर रहे हैं।

4

ROFL - एनिमेशन विलंब एक सर्वर साइड पर लागू किया: डी

एक बहाना के साथ "एक ग्राहक है कि देरी की जरूरत है" एक देरी लाना विधि ग्राहक अवगत बनाता है। और यह एक गंध है। एक अर्थ में यह एसआरपी का भी उल्लंघन करता है - क्योंकि अब विधि दो चीजें करता है (कुछ उपयोगी होता है और देरी करता है) और यदि आप नींद रखना चाहते हैं तो आपको इसे नाम में इंगित करना होगा, जैसे: DoSomethingUsefulAndDelayToo()

लेकिन मेरे लिए "विधि कॉलर अज्ञेयवादी" मुख्य बिंदु होना चाहिए।

बहाना सिद्धांत चिंताओं की जुदाई का उल्लंघन करती है "हम एक देरी की जरूरत है" - के बाद से अब अपनी विधि न केवल आप डेटा हो जाता है, लेकिन यह भी एक प्रस्तुति तर्क (एनिमेशन) से दूषित।

इसके अलावा, आप एनीमेशन कतार में देरी परिचय (और चाहिए) आसानी से jQuery उपयोग किया जा सकता कर सकते हैं।

सिद्धांतों हैं वहाँ एक कारण के लिए, यह अनुभव है कि सिद्धांतों का उल्लंघन करने प्रभाव नहीं हमेशा हर मामले में तुरंत स्पष्ट है से है, लेकिन ज्यादातर मामलों में यह वापस आने और आप शिकार होगा।

वह यह कहा कम से कम दो में विधि को तोड़ने रहता है - एक विधि अभी करना होगा "नींद (6000), वापसी," अब यह हास्यास्पद होगा।

2

कैसे मैं प्रोग्रामर यह क्यों इतना गलत है व्याख्या कर सकते हैं?

सरल। स्लीप() का उपयोग code smell है। अवधि।

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