2011-10-16 15 views
6

मैं अगर एक ASP.NET MVC अनुप्रयोग में एक स्थिर वर्ग हो सकता है सोच रहा हूँ एक बार की तुलना में अधिक से प्रारंभ। मैंने शुरुआत में अपने ऐप को डिज़ाइन किया ताकि एक स्थिर घटक डाटाबेस से कुछ सामान लाए और कैश के रूप में कार्य करेगा, और मैंने कक्षा में एक ताज़ा तरीका जोड़ा जिसे कन्स्ट्रक्टर से बुलाया गया था। ऐप के प्रशासनिक हिस्से के माध्यम से रीफ्रेश विधि भी उपलब्ध कराई गई थी। किसी बिंदु पर मैंने देखा कि डेटा को मैन्युअल ट्रिगर की आवश्यकता के बिना अपडेट किया गया था, जिसका अर्थ है कि स्थिर कन्स्ट्रक्टर एक से अधिक बार चलाता है।स्थिर वर्ग

ऐसे कई परिदृश्य हैं जहां मैं उचित रूप से ऐसा देख सकता हूं, जैसे एक अनचाहे Exception पुन: प्रारंभ करने का कारण बनता है। लेकिन मुझे इसे पुन: उत्पन्न करने में परेशानी हो रही है, इसलिए मैं निश्चित रूप से जानना चाहता हूं।

+1

सुनिश्चित करें कि आपकी कक्षा ** पूरी तरह से ** थ्रेड-सुरक्षित है। – SLaks

उत्तर

10

सबसे सामान्य स्थितियों होगा:

  • वेब अनुप्रयोग

    • छुआ Web.config
    • की एक पुनः लोड छुआ बाइनरी
    • असामान्य समाप्ति (आउट-ऑफ-स्मृति , अनुमति त्रुटियां)
  • आवेदन पूल

  • आईआईएस की पुन: प्रारंभ करने की एक बार पुनः लोड करने
  • w3wp.exe की पुन: प्रारंभ करने (कम से कम एक बार 29 घंटे में!)

एप्लिकेशन-डोमेन पुनः लोड हो जाएगी (recompiling आवश्यकतानुसार गतिशील भागों) और यह किसी भी स्थैतिक प्रारंभिक डेटा को रद्द कर देगा।

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

अद्यतन: फिल Haack सिर्फ एक प्रासंगिक ब्लॉग प्रविष्टि यहाँ प्रकाशित: http://haacked.com/archive/2011/10/16/the-dangers-of-implementing-recurring-background-tasks-in-asp-net.aspx

  • बाय बाय अनुप्रयोग डोमेन
    • यह करता है ऊपर समझा में बेहतर काम । उल्लेखनीय, आईआईएस पुनरावृत्ति होगा यह कार्यकर्ता प्रक्रिया कम से कम बहुत 29 घंटे और साझा होस्टर AppDomain अधिक बार (शायद निष्क्रिय समय के 20 मिनट में)
  • तो ASP.NET, "बता अरे, मैं रीसायकल होगा यहाँ काम कर रहा है!"
    • तकनीक आप एक AppDomain की सूचना पाने के लिए आवेदन कर सकते नीचे ले रूपरेखा - आप इस का उपयोग व्यवहार कर 'सही ढंग से'
  • सिफ़ारिश अपने सिंगलटन उदाहरण प्राप्त करने के लिए कर सकता है

मेरा सुझाव है कि आप इसे पढ़ लें :)

+0

अपडेट_: फिल हैक ने यहां एक रिलेवेंट ब्लॉग एंट्री प्रकाशित की है: http://haacked.com/archive/2011/10/16/the-dangers-of-implementing-recurring-background-tasks-in-asp-net.aspx । मैंने – sehe

+1

को एकत्रित जानकारी को प्रतिबिंबित करने के उत्तर को अद्यतन किया है, मुझे हाल ही में पता चला है कि मेरी समस्या एप्लिकेशन पूल टाइमआउट के पुनः लोड होने के कारण थी, जो 20 मिनट या उससे अधिक के लिए निष्क्रिय होने वाले ऐप्स को मारने के लिए निर्धारित है। यह विंडोज़ एज़ूर पर था, और [इस पोस्ट] (http://blog.smarx.com/posts/controlling-plication-pool-idle-timeouts-in-windows-azure) ने मुझे अपनी समस्या हल करने में मदद की। – Gleno

4

static कक्षाएं प्रति ऐपडोमेन में एक बार शुरू की जाती हैं।

यदि आईआईएस आपके ऐपडोमेन को रीसायकल करता है, तो सबकुछ फिर से शुरू हो जाएगा।

+0

क्या आईआईएस मेरे ऐपडोमेन को रीसायकल कर सकता है जब ऐसा लगता है? – Gleno

+0

हां; यह कर सकता है और करेगा। मेरा मानना ​​है कि यह कुछ हद तक विन्यास योग्य है। – SLaks

+0

मैं Azure का उपयोग कर रहा हूं, आईआईएस कॉन्फ़िगरेशन से खुद को दूर करने के लिए; लेकिन यह जानना अच्छा है। – Gleno

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