2009-04-23 13 views
5

मैंने इस विषय के बारे में बहुत सी चर्चा देखी है।सी # और स्टेटिक क्लासेस और कार्यों के बारे में एक प्रश्न

यदि मेरे पास डेटाबेस या सर्वर से कनेक्ट होने वाली स्थिर श्रेणी w/स्थिर विधियां हैं, तो क्या यह एक बहु-उपयोगकर्ता वातावरण (जैसे एक वेब पेज) में उपयोग करना बुरा विचार है? क्या यह एक नया उपयोगकर्ता स्वीकार करने से पहले पिछले उपयोगकर्ताओं के धागे के लिए अपनी कॉल समाप्त करने के लिए एक नया उपयोगकर्ता का इंतजार करेगा?

बहु-थ्रेडिंग के साथ इसका क्या प्रभाव होगा?

Thx!

उत्तर

6

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

  • सबसे पहले, आप एक कार्यान्वयन के लिए बहुत कसकर बाध्यकारी हैं, जो हमेशा खराब होता है।
  • दूसरा, आपके स्थैतिक तरीकों पर निर्भर सभी वर्गों का परीक्षण करना बहुत मुश्किल हो जाता है, क्योंकि आप एक ही कार्यान्वयन में बंद हैं।
  • तीसरा, गैर-थ्रेड सुरक्षित विधियों को बनाना बहुत आसान हो जाता है क्योंकि स्थिर विधियों में केवल स्थिर स्थिति हो सकती है (जिसे सभी विधि कॉल में साझा किया जाता है)।
0

इस प्रश्न से थोड़ा अजीब। आप इतने स्थिर क्यों चल रहे हैं।

लेकिन मुझे लगता है कि आप मुद्दों सूत्रण के बारे में पूछ रहे हैं, तो मैं जाने ज ttp://msdn.microsoft.com/en-us/library/c5kehkcz(VS.80).aspx

0

स्टेटिक केवल उस क्षेत्र को परिभाषित कर रहा है जहां विधि परिभाषित की गई है, और यह कैसे बाध्य/बुलाया जाता है। इसमें बहु थ्रेडिंग के साथ कुछ लेना देना नहीं है।

आपको स्थिर क्षेत्रों से सावधान रहना होगा। वे सभी धागे से साझा कर रहे हैं। थ्रेड एक दूसरे के लिए इंतजार नहीं कर रहे हैं, लेकिन आपको इसे काम करने के लिए ताले की जरूरत है।

लेकिन यदि आपका एप्लिकेशन हैलो वर्ल्ड की तुलना में थोड़ा अधिक जटिल है, तो आपको विचार करना चाहिए कि आप विधियां स्थिर नहीं हैं बल्कि ऑब्जेक्ट उन्मुख पैटर्न का उपयोग करें।

3

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

1

हां यह एक बुरा विचार है।

आप अपने सभी उपयोगकर्ताओं के लिए एक कनेक्शन का उपयोग करते हैं, तो किसी को सिर्फ डेटाबेस का उपयोग के लिए, एक ऐसी कार्रवाई की आवश्यकता है करता है 15 सेकंड का कहना है की सुविधा देता है, अन्य सभी उपयोगकर्ताओं के क्रम में प्रतीक्षा करने के लिए डेटाबेस से कनेक्ट करना होगा

+0

यहाँ बुरा विचार नहीं कनेक्शन, स्थिर तरीकों का उपयोग, IMO है। –

+0

मैं आपसे सहमत हूं – Sergio

0

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

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

यदि आप एक स्थिर कनेक्शन पूल का उपयोग करते हैं तो आप इस प्रदर्शन प्रभाव को कम कर देंगे क्योंकि आपको केवल कनेक्शन पूल तक पहुंच को क्रमबद्ध करने की आवश्यकता है।

आगे, सांख्यिकी सामान्य रूप से एक अच्छा डिजाइन निर्णय नहीं है - वे यूनिट परीक्षण को बहुत जटिल बनाते हैं। आपको सिंगलटन या मोनोस्टेट पैटर्न का उपयोग करने पर विचार करना चाहिए।

0

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

कभी कभी सही और गलत के बीच का अंतर बहुत ही सूक्ष्म और कठिन पहचानना हो सकता है, लेकिन मुख्य बात यह है कि कोई विधि पर भरोसा करते हैं या किसी "राज्य" वर्ग के (सदस्य) ताला चाहिए।

0

मैं देखने वस्तुओं के लिए स्थिर विधि का उपयोग करें। मैं asp.net अनुप्रयोग के लिए एक ही स्थान पर (कैशिंग का उपयोग) में सभी लुकअप वस्तुओं का प्रबंधन कर सकते हैं और सभी तरीकों स्थिर विधि का उपयोग कर यह कहते हैं।

इस वैसे, मैं वस्तुओं हर मैं इसे जरूरत लुकअप का दृष्टांत की जरूरत नहीं है और यह प्रदर्शन को बढ़ाने के लिए डीबी कॉल करने के लिए की जरूरत को कम।

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