में रनटाइम पर गतिशील ताले बनाना इस कोड के लिए निम्नलिखित मान्यताओं मान्य हैं? मैंने कोड के तहत कुछ पृष्ठभूमि जानकारी डाली, लेकिन मुझे नहीं लगता कि यह प्रासंगिक है।ASP.NET
अनुमान 1: चूंकि यह एक ही एप्लीकेशन है, इसलिए मैं धारणा कर रहा हूं कि इसे एक ही प्रक्रिया द्वारा संभाला जाएगा। इस प्रकार, स्थिर चर धागे के बीच साझा किए जाते हैं, और लॉक ऑब्जेक्ट्स का मेरा संग्रह स्थिर रूप से मान्य है।
अनुमान 2: यदि मुझे पता है कि मूल्य पहले से ही शब्दकोश में है, तो मुझे पढ़ने पर लॉक करने की आवश्यकता नहीं है। मैं एक ConcurrentDictionary का उपयोग कर सकता हूं, लेकिन मेरा मानना है कि यह सुरक्षित होगा क्योंकि मैं गणना नहीं कर रहा हूं (या हटा रहा हूं), और मान मौजूद होगा और जब मैं UnlockOnValue()
पर कॉल करता हूं तो नहीं बदलेगा।
अनुमान 3: मैं कुंजी संग्रह को लॉक कर सकता हूं, क्योंकि उस संदर्भ में परिवर्तन नहीं होगा, भले ही अंतर्निहित डेटा संरचना करता है।
private static Dictionary<String,Object> LockList =
new Dictionary<string,object>();
private void LockOnValue(String queryStringValue)
{
lock(LockList.Keys)
{
if(!LockList.Keys.Contains(queryStringValue))
{
LockList.Add(screenName,new Object());
}
System.Threading.Monitor.Enter(LockList[queryStringValue]);
}
}
private void UnlockOnValue(String queryStringValue)
{
System.Threading.Monitor.Exit(LockList[queryStringValue]);
}
तब मैं की तरह इस कोड का प्रयोग करेंगे:
LockOnValue(Request.QueryString["foo"])
//Check cache expiry
//if expired
//Load new values and cache them.
//else
//Load cached values
UnlockOnValue(Request.QueryString["foo"])
पृष्ठभूमि: मुझे लगता है कि प्रश्न में एक भी उपयोगकर्ता परिभाषित चर के आधार पर डाउनलोड डेटा ASP.NET में एक ऐप्लिकेशन बना रहा हूं स्ट्रिंग। मूल्यों की संख्या काफी सीमित होगी। मुझे निर्दिष्ट अवधि के लिए प्रत्येक मान के परिणामों को कैश करने की आवश्यकता है।
दृष्टिकोण: मैंने डेटा को कैश करने के लिए स्थानीय फ़ाइलों का उपयोग करने का निर्णय लिया, जो कि सबसे अच्छा विकल्प नहीं है, लेकिन मैं इसे आजमा देना चाहता था क्योंकि यह गैर-महत्वपूर्ण है और प्रदर्शन एक बड़ा मुद्दा नहीं है। मैंने प्रति विकल्प 2 फाइलों का उपयोग किया, एक कैश समाप्ति तिथि के साथ, और डेटा के साथ एक।
समस्या: मुझे यकीन नहीं है कि लॉकिंग करने का सबसे अच्छा तरीका क्या है, और मैं .NET में थ्रेडिंग समस्याओं से अधिक परिचित नहीं हूं (कारणों में से एक कारण मैंने इस दृष्टिकोण को चुना है)। जो उपलब्ध है, और जो मैंने पढ़ा है, उसके आधार पर, मैंने सोचा कि उपरोक्त काम करना चाहिए, लेकिन मुझे यकीन नहीं है और दूसरी राय चाहिए।
'HttpRuntime.Cache' का उपयोग करने में क्या समस्या है? – scottm
यह मेरी पहली पसंद थी, लेकिन यह अजीब अभिनय कर रहा था। ऐसा इसलिए हो सकता है क्योंकि मेरा पृष्ठ प्रतिक्रिया को मिटा देता है और एक टेक्स्ट फ़ाइल देता है, लेकिन मैंने सभी इंटरनेट पर पोस्ट किए गए समान मुद्दों में भाग लेने के बाद बहुत गहराई से खोला नहीं है, मेरे लिए कोई जवाब नहीं है। आईआईएस कॉन्फ़िगरेशन में एकमात्र चीज नहीं आई थी और कैशिंग को सही तरीके से कॉन्फ़िगर किया गया था या नहीं। मैं अभी भी बाद में ऐसा कर सकता हूं, लेकिन यह ऐसा गैर-महत्वपूर्ण कोड है और यह उठाए गए प्रश्न हैं जिन्हें मैं जवाब देना चाहता था, भले ही यह सर्वोत्तम वास्तुकला न हो। – Kendrick
मैं आपके लिए एक बहुत ही समान समाधान लागू करने की कोशिश कर रहा हूं जहां मैं कैशिंग विधियों के परिणाम देख रहा हूं। मुझे अलग-अलग कैश ताले बनाने का भी एक तरीका चाहिए और मैं सोच रहा था कि क्या आपके समाधान ने समय, चीयर्स के परीक्षण को रोक दिया है। –