2012-01-18 18 views
52

मैं पेज क्लास में परिभाषित स्थैतिक चर में कुछ जानकारी रख रहा हूं (ग्लोबल.एक्सएक्स में नहीं)। मैं केवल कोड में परिवर्तनीय घोषित करता हूं जैसे:लाइफटाइम ऑफ एएसपी.नेट स्टेटिक वैरिएबल

protected static int SomeGlobalUnsecureID; 
protected static string SomeGlobalUnsecureString; 

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

  1. उपयोगकर्ताओं की परवाह किए बिना स्मृति का एक ही राशि पकड़ो जुड़ा है

  2. यदि और केवल यदि लगातार जानकारी 'स्मृति' में एक से अलग है (क्योंकि वास्तव में पढ़ने बदलें स्ट्रिंग के लिए लेने के लिए मुझे समय है।

अब, के बाद से मैं pageload में जाँच करना, मैं पुनः लोड पृष्ठों में कोई समस्या नहीं है। लेकिन मेरा पेज, webMethods से भरा हुआ है और कभी कभी मैं था देखना स्थिर चर को शून्य किया जाता है। और अजीब हिस्सा है; सत्र स्थिर तब भी सक्रिय होता है जब स्थैतिक चर शून्य हो जाते हैं (इसलिए-> कोई सर्वर या ऐप। पूल पुनरारंभ आदि)

यह मेरे लिए वास्तव में अजीब है। मुझे लगता है कि जब तक एप्लिकेशन (किसी भी तरह) समाप्त नहीं हो जाता है तब तक स्थैतिक चर अपना मूल्य रखेगा। लेकिन सत्र भी समाप्त नहीं हुआ, स्थिर चर शून्य हो गया है। आपकी क्या सलाह है? अनुप्रयोग चर का उपयोग बेहतर विकल्प है? वेब पर मैंने जो भी दस्तावेज पढ़े हैं, वे अनुप्रयोग चर के बजाय स्थैतिक चर का सुझाव देते हैं, क्या मुझे उन्हें किसी भी तरह से अलग करने की आवश्यकता है?

+1

अपने प्रश्न के शीर्ष पर घोषणाओं * * स्थिर btw नहीं कर रहे हैं। –

+1

:) ठीक है, ठीक किया –

+1

'Pageload घटना में चर परिभाषित करते हैं।' मुझे लगता है कि आप शुरू करना मतलब है? एक चर को परिभाषित करना है कि तुम क्या जब आप लिखते हैं 'संरक्षित स्थिर पूर्णांक कुछ कर रहे हैं,"। अब, के बाद से मैं Pageload में जाँच करना, मैं पुनः लोड पृष्ठों में कोई समस्या नहीं "' –

उत्तर

73

स्थिर डोमेन ऐप डोमेन के जीवन के लिए बने रहते हैं। तो दो चीजें जो आपके स्थैतिक चर को 'रीसेट' करने का कारण बनती हैं, एक ऐप डोमेन पुनरारंभ होता है या एक नई कक्षा का उपयोग होता है। एक aspx पृष्ठ वर्ग में संग्रहीत स्थैतिक चर के साथ अपने मामले में, आप स्थैतिक चर वंचित हो रहे हैं जब ASP.NET एक नया वर्ग में aspx पृष्ठ पुन: संयोजित करने के लिए फैसला करता है, नए के साथ पुराने पेज वर्ग की जगह।

उन कारणों के लिए है, तो सिस्टम को पुनः आरंभ या वर्ग (तब है क्योंकि आप पुनः आरंभ करने या बदलने के साथ एक नया वर्ग हो रही है अपने स्थैतिक चर रीसेट कर देगा की जगह .NET doesn't kill or unload classes/assemblies in a running app domain करने का फैसला। यह दोनों aspx पन्ने पर लागू होता है और classes in the App_Code folder

एएसपी.नेट किसी भी कारण से सोचता है कि किसी भी कारण से इसे पुन: संकलित करने की आवश्यकता है (see ASP.NET dynamic compilation

आप किसी ऐप डोमेन पुनरारंभ से स्थिर चर के नुकसान को रोक नहीं सकते हैं, लेकिन आप कक्षा प्रतिस्थापन से बचने का प्रयास कर सकते हैं । आप आप एक वर्ग है कि एक aspx पेज नहीं है और App_Code निर्देशिका में नहीं है में अपने स्थैतिक चर डाल सकता है। अपने कार्यक्रम में एक static class कहीं पर उन्हें जगह कर सकते हैं।

public static class GlobalVariables 
{ 
    public static int SomeGlobalUnsecureID; 
    public static string SomeGlobalUnsecureString; 
} 

स्थैतिक चर, पूल प्रति का मतलब है कि है कि यदि आप 2 पूल कि अपने asp.net साइट चलाता है, तो आप 2 अलग स्थैतिक चर है। (Web garden mode)

यदि सिस्टम आपके एएसपीनेट एप्लिकेशन को इस तरह से पुनरारंभ करता है तो स्थैतिक चर खो जाते हैं।

  1. पूल निर्णय लेता है कि एक पुन: संकलन करने की आवश्यकता है।
  2. आप app_offline.htm फ़ाइल
  3. खोलने आप पूल
  4. पूल कुछ सीमाएं है कि आप को परिभाषित करने और पुनः आरंभ कर दिया है तक पहुँचने है की पुस्तिका को पुनः आरंभ कर सकते हैं।
  5. किसी भी कारण से आप आईआईएस पुनरारंभ करें, या पूल के लिए।

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

के बाद से कोई एप्लिकेशन पुनः आरंभ अपने स्टैटिक्स कोई बात नहीं पर रीसेट कर देगा क्या, यदि आप वास्तव में अपने डेटा को बनाए रखना चाहते हैं, तो आप डेटा एक डेटाबेस में कस्टम वर्गों का उपयोग संग्रहीत करना चाहिए। आप Session State में database session state mode के साथ प्रति उपयोगकर्ता जानकारी स्टोर कर सकते हैं। एएसपी.नेट आवेदन राज्य/चर आपकी मदद नहीं करेंगे क्योंकि they are stored in memory, not the database, इसलिए वे ऐप डोमेन पर भी पुन: प्रारंभ हो जाते हैं।

+0

इस तरह के निरंतर एप्लिकेशन डेटा को स्टोर करने के लिए बेहतर तरीका क्या है, किसी प्रकार का बाहरी कैशिंग स्टोर? –

+0

@DanielPowell निर्भर करता है। मेरे कार्यक्रम में मेरे पास कई पूल हैं और डेटाबेस पर सहेजे गए सभी धागे डेटा के लिए कई थ्रेड सामान्य हैं। प्रत्येक एप्लिकेशन के लिए सामान्य डेटा वैश्विक स्थैतिक वर्ग में सहेजा गया। – Aristos

+0

एक अंतिम बात; मैंने वैश्विक और नामित गुणों का एक स्थिर वर्ग बनाया है। .cs कोड में ठीक काम करता है, लेकिन एएसपीएक्स में मैं <% = global.someproperty%> के साथ वैश्विक वर्ग तक नहीं पहुंच सकता हूं, वे एक ही नामस्थान में हैं। क्या यह सामान्य है? –

-5

स्टेटिक चर एक ही मूल्य

protected void Page_Load(object sender, EventArgs e) 
{ 
    sss s1, s2; 
    s1 = new sss(); 
    s1.TotalMark = 10; 
    s2 = new sss(); 
    s2.TotalMark = 20; 
    sss.SchoolName = "St.Joseph's Hr.Sec.S"; //We can access through class and assign common to all 
    s1.PrintData(); 
    s2.PrintData(); 
} 

public class sss 
{ 
    public static string SchoolName { set; get; } 
    public int TotalMark { set; get; } 
    public string StudentName{set;get;} 
    public void PrintData() 
    { 
     Console.WriteLine(TotalMark); 
     Console.WriteLine(SchoolName); 
     Console.WriteLine(StudentName); 
    } 
} 
+0

नीचे मतदान किया गया, यह उत्तर प्रश्न से संबंधित नहीं है। (ओपी स्पष्ट रूप से समझता है कि स्थैतिक चर कैसे काम करते हैं। - सवाल यह है कि वे सही तरीके से क्यों काम नहीं कर रहे हैं।) - इसके अतिरिक्त स्पष्टीकरण खराब तरीके से कहा जाता है। – BrainSlugs83

4

मैं निम्नलिखित दो अंक भी स्थैतिक चर के जीवन भर के लिए महत्वपूर्ण हैं लगता है के लिए सभी वस्तु स्टोर करने के लिए प्रयोग किया जाता है:

1 - अपने अनुप्रयोग पूल के दशक में उन्नत सेटिंग्स "रीसाइक्लिंग" -> "नियमित समय अंतराल (मिनट)" सेटिंग की जांच करें। यह डिफ़ॉल्ट मान 1740 है जिसका मतलब है कि प्रत्येक 2 9 घंटों में आपके स्थिर पूल को आपके एप्लिकेशन पूल के रीसाइक्लिंग के कारण खो दिया जाता है। इस सेटिंग का उपयोग संभावित मेमोरी लीक को समाप्त करने के लिए किया जाता है। मैं इस सेटिंग ..

2 में परिवर्तन नहीं होगा - अपने आवेदन पूल की उन्नत सेटिंग्स में जाँच "प्रक्रिया मॉडल" -> "निष्क्रिय टाइम-आउट (मिनट)" सेटिंग। यह डिफ़ॉल्ट मान 20 है जिसका अर्थ है आपके आवेदन पूल में निष्क्रियता के प्रत्येक 20 मिनट में, कार्यकर्ता प्रक्रियाओं को समाप्त/निलंबित कर दिया जाता है जिससे आपके स्थिर चर खो जाएंगे। इस सेटिंग का उपयोग संसाधनों को मुक्त करने के लिए किया जाता है जब एप्लिकेशन पूल का उपयोग कुछ समय में नहीं किया जाता है। आप टाइमआउट को अक्षम करने के लिए इसे 0 पर सेट कर सकते हैं।

+0

धन्यवाद। ** रीसाइक्लिंग ** मेरे मामले में समस्या थी। – Isaac

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