2009-03-10 15 views
5

मैं WeakReference से परिचित हूं, लेकिन मैं एक संदर्भ प्रकार की तलाश कर रहा हूं जिसे केवल साफ़ किया जाता है जब स्मृति कम होती है, न कि जब हर बार जीसी चलता है (जैसे जावा के SoftReference)। मैं एक स्मृति-संवेदनशील कैश को लागू करने का एक तरीका ढूंढ रहा हूं।.NET में सॉफ़्ट रेफरेंस के बराबर है?

उत्तर

0

कोई समकक्ष नहीं है। क्या कोई विशेष कारण है कि WeakReference नौकरी नहीं करेगा?

Why doesn't .NET have a SoftReference as well as a WeakReference, like Java?

+3

-1 टोनी ने कहा कि वह स्मृति-संवेदनशील कैश को कार्यान्वित करना चाहता था। फिर भी एमएसडीएन कमजोर संदर्भों के बारे में यह कहता है: "स्मृति प्रबंधन समस्याओं के स्वचालित समाधान के रूप में कमजोर संदर्भों का उपयोग करने से बचें। इसके बजाय, अपने आवेदन की वस्तुओं को संभालने के लिए एक प्रभावी कैशिंग नीति विकसित करें।" –

2

शायद ASP.NET कैश वर्ग (System.Web.Caching.Cache) को प्राप्त आप क्या चाहते हैं मदद कर सकता है:

यहाँ मिलती-जुलती सवाल है? स्मृति कम हो जाता है यह स्वचालित रूप से वस्तुओं को हटाने:

Here's an article से पता चलता है कि कैसे एक खिड़कियों में कैश वर्ग का उपयोग करने के आवेदन रूपों।

2

एएसपी.नेट कैश के अतिरिक्त, माइक्रोसॉफ्ट पैटर्न और प्रैक्टिस समूह से कैशिंग एप्लिकेशन ब्लॉक है।

http://msdn.microsoft.com/en-us/library/cc309502.aspx

2

ASP.NET कैश, आप स्मृति के प्रति संवेदनशील व्यवहार आप चाहते हैं देता है दोष यह है कि सब कुछ एक अद्वितीय कुंजी की जरूरत के साथ। हालांकि, आप ASP.NET कैश में रखे गए किसी ऑब्जेक्ट को WeakReference रखने में सक्षम होना चाहिए। कैश का मजबूत संदर्भ जीसी को तब तक रखेगा जब तक कि कैश का फैसला न हो कि उसे मुफ्त मेमोरी में स्कैन किया जाना चाहिए। WeakReference आपको कैश कुंजी के साथ लुकअप किए बिना ऑब्जेक्ट तक पहुंच प्रदान करता है।

Foo cachedData = new Foo(); 
WeakReference weakRef = new WeakReference(cachedData); 
HttpRuntime.Cache[Guid.NewGuid().ToString()] = cachedData; 

... 

if (weakRef.IsAlive) 
{ 
    Foo strongRef = weakRef.Target as Foo; 
} 

आप

class SoftReference : WeakReference 
{ 
    public SoftReference(object target) : base(target) 
    { 
     HttpRuntime.Cache[Guid.NewGuid().ToString()] = target; 
    } 
} 

की तर्ज आप यह भी सुनिश्चित है कि किसी भी नए लक्ष्य कैश में चला जाता है बनाने के लिए लक्ष्य पर सेटर ओवरराइड करने के लिए आवश्यकता होगी साथ WeakReference बढ़ा कर एक SoftReference वर्ग बना सकते हैं।

1

हालांकि SoftReference मेमोरी कैशिंग को कार्यान्वित करने के लिए एक सुविधाजनक तरीका प्रतीत हो सकता है, इसके लिए जावा रनटाइम को कुछ हद तक मनमाने ढंग से दृढ़ संकल्प करने की आवश्यकता होती है कि किसी ऑब्जेक्ट को रखने के लिए लागत को स्टोर करने की लागत से अधिक है या नहीं। दुर्भाग्यवश, रनटाइम में ऑब्जेक्ट को रखने की वास्तविक लागत के बारे में सीमित जानकारी है (इस बात को ध्यान में रखते हुए कि वास्तविक लागत में अन्य अनुप्रयोगों पर किसी एप्लिकेशन के मेमोरी उपयोग का प्रभाव शामिल हो सकता है), और व्यावहारिक रूप से वस्तु को चारों ओर रखने के लाभ के बारे में कोई जानकारी नहीं है ।

यदि किसी ऑब्जेक्ट को इसके आसपास कोई मजबूत संदर्भ नहीं होने पर भी ऑब्जेक्ट को रखने के लिए उपयुक्त होगा, तो कैश को इसके लिए एक मजबूत संदर्भ रखना चाहिए (कम से कम जब तक यह बेकार लगता है)। यदि ऑब्जेक्ट को कैश में रखने से लाभ केवल तब तक विस्तारित होगा जब तक बाहरी संदर्भ मौजूद न हो (उदाहरण के लिए, उदाहरणों का उत्पादन करना सस्ता है, लेकिन समान डेटा रखने वाले दो लॉजिकल इकाइयां रखने के लिए उन्हें एक ही उदाहरण का उपयोग करने के लिए उन इकाइयों के बीच तुलना की सुविधा होगी), किसी को WeakReference का उपयोग करना चाहिए।

संयोग से, अगर मेरे ड्रूटर थे, तो।नेट किसी अन्य प्रकार के संदर्भ का समर्थन करेगा जिसे मैंने किसी भी प्लेटफॉर्म में नहीं देखा है: "किसी और के लिए ब्याज" संदर्भ, जिसका उपयोग WeakReference के प्रकार के साथ किया जाएगा। एक "किसी और के लिए ब्याज" संदर्भ का उपयोग एक मजबूत संदर्भ के रूप में किया जा सकता है, लेकिन एक उपयुक्त कॉन्फ़िगर किए गए WeakReference को अमान्य कर दिया जाएगा यदि उसके लक्ष्य के केवल मजबूत संदर्भ "किसी और के लिए ब्याज" थे। एक समेकित जीसी का उपयोग करते समय ऐसी अवधारणा दक्षता में सुधार कर सकती है, ऐसे मामलों में जहां एक कमजोर घटना हैंडलर बार-बार अपने लक्ष्य के लिए एक मजबूत संदर्भ उत्पन्न करेगा। यदि कोई भी व्यक्ति वास्तव में रुचि नहीं रखता है कि ईवेंट हैंडलर अपने लक्ष्य के साथ क्या कर रहा है, तो यह वांछनीय होगा अगर हैंडलर सदस्यता समाप्त कर सके।

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