दिलचस्प पोस्ट
JSON.NET पार्सर * मेरी वस्तुओं को दोहरी धारावाहिक होना * लगता है एक फ़ोन कॉल को प्रोग्रामेटिक रूप से बनाएं ऐसी फाइल लोड नहीं कर सकता – रेलवे पर रूबी पर sqlite3 / sqlite3_native (लोड इरर) कैसे सी # और OneNote Interop का उपयोग कर एक OneNote 2013 पृष्ठ को लिखें काउंटडाउनलाच बनाम सेमाफोर आईफोन के लिए एक स्थैतिक पुस्तकालय में कोर डेटा एपीके फ़ाइल डिस्क पर मौजूद नहीं है AngularJS: एक HTTP इंटरसेप्टर (सर्कुलर निर्भरता) में सेवा इंजेक्शन "#include" को एक सी फ़ाइल में एक पाठ फ़ाइल में चार के रूप में मैं संदर्भ के एक सदिश क्यों नहीं बना सकता? एक FacesConverter में सीडीआई इंजेक्शन सूची के तत्वों के सभी संभव संयोजन कैसे प्राप्त करें? मौजूदा ऑब्जेक्ट इंस्टेंस के लिए एक विधि जोड़ना त्रुटि प्राप्त करना: 'त्रुटि: SSL त्रुटि: SELF_SIGNED_CERT_IN_CHAIN' npm का उपयोग करते समय एक विंडोज़ प्रपत्र आवेदन पत्र में एक फ़ाइल एक्सप्लोरर उदाहरण को एम्बेड करना

एएसपी.नेट में ऐप्लीकेशन स्थिति के बजाय स्थिर वैरिएब का उपयोग करना

मैं एएसपी.नेट में अनुप्रयोग स्थिति के बजाय स्थैतिक चर का उपयोग करने के लिए विमान और सोच रहा हूं कि यह सही दृष्टिकोण है:

[Global.asax.cs] ... public class Global : System.Web.HttpApplication { void Application_Start(object sender, EventArgs e) { // Code that runs on application startup } ... private static Dictionary<string, object> cacheItems = new Dictionary<string, object>(); private static object locker = new object(); public static Dictionary<string, object> CacheItems { get { lock (locker) { return cacheItems; } } set { lock (locker) { cacheItems = value; } } } public static void RemoveCacheItem(string key) { cacheItems.Remove(key); } ... } 

जैसा कि आप देख सकते हैं कि मैं स्वचालित रूप से निर्मित Global.asax (और पीछे कोड) फ़ाइल का उपयोग करता हूं। मैंने कुछ स्थिर चर और विधियों को जोड़ दिया है मैं उन्हें इस तरीके से उपयोग कर सकता हूं:

 [some .cs file] foreach(KeyValuePair<string, object> dictItem in Global.CacheItems) { ... 

क्या यह सही तरीके है या मुझे मौजूदा ग्लोबल के बजाय नया वर्ग बनाना चाहिए? अगर मुझे नया वर्ग बनाना चाहिए तो मैं यह कैसे और कहाँ कर सकता हूं?

वेब के समाधान से एकत्रित समाधान "एएसपी.नेट में ऐप्लीकेशन स्थिति के बजाय स्थिर वैरिएब का उपयोग करना"

माइक्रोसॉफ्ट क्या कहते हैं

एएसपी.नेट में मुख्य रूप से क्लासिक एएसपी के साथ संगतता के लिए आवेदन स्थिति शामिल है, ताकि मौजूदा अनुप्रयोगों को एएसपी.नेट में स्थानांतरित करना आसान हो। यह अनुशंसा की जाती है कि आप एप्लिकेशन ऑब्जेक्ट के बजाय एप्लिकेशन क्लास के स्थिर सदस्यों में डेटा संग्रहीत करें। यह कार्यक्षमता बढ़ाता है क्योंकि आप एक स्थिर वैरिएबल तक पहुँच सकते हैं, जितना कि आप एप्लिकेशन शब्दकोश में कोई आइटम एक्सेस कर सकते हैं।

संदर्भ: http://support.microsoft.com/default.aspx?scid=kb;en-us;Q312607

मेरा expirience

स्थिर वैरिएबल और एप्लिकेशन स्थिति के बीच मुख्य अंतर यह है कि अनुप्रयोग स्थिति सभी थ्रेड्स और पूल में एक समान है, लेकिन स्थिर प्रति पूल केवल एक ही है।

नए परीक्षणों के बाद मैं देखता हूं कि अनुप्रयोग राज्य चर स्थिर वैरिएबल के समान हैं, और वे आवेदन पर स्थिर वैरिएबल के संदर्भ में हैं, और ये सिर्फ संगतता के कारण मौजूद हैं क्योंकि माइक्रोसॉफ्ट का कहना है

यदि आपके पास अपनी साइट (वेब ​​गार्डन) चलने वाले 4 पूल हैं, तो आपके पास 4 अलग-अलग स्थैतिक स्मृति सेट हैं

तुम्हारा कोड

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

  // this is not enough to manipulate your data ! public static Dictionary<string, object> CacheItems { get{ lock (locker){return cacheItems; } } set{ lock (locker){cacheItems = value;} } } 

सही तरीका यह है कि जब तक आप काम नहीं करते हैं, तब तक जोड़ने / हटाने के सभी कार्यों को लॉक करना है, उदाहरण के लिए।

 private static Dictionary<string, object> cacheItems = new Dictionary<string, object>(); private static object locker = new object(); public Dictionary<string, object> CacheItems { get{ return cacheItems; } set{ cacheItems = value;} } SomeFunction() { ... lock(locker) { CacheItems["VariableName"] = SomeObject; } ... } 

दूसरी तरफ जब आप आवेदन स्थिति पर डेटा में हेरफेर करते हैं तो आपको इसके वैश्विक लॉक का उपयोग करना होगा Application.Lock(); और Application.UnLock(); उदाहरण के लिए

 Application.Lock(); Application["PageRequestCount"] = ((int)Application["PageRequestCount"])+1; Application.UnLock(); 

परिणाम के साथ बंद करने के लिए:

एप्लिकेशन स्थिति से बचें और बस अपने कोड पर स्थिर चर का उपयोग करें।