2011-06-27 13 views
14

मैं इस तरह एक समारोह की जरूरत है:टाइमआउट के साथ सूची/समय सीमा समाप्त क्षमता

AddToList(txtName, timeExpire); 

ऐसा लगता है कि स्व-वर्णनात्मक, आइटम स्वचालित रूप से समाप्त और सूची से हटा दिया जाएगा लग रहा है।

मैं कल्पना नहीं कर सका कि यह कैसे करें। क्या कोई मुझे एक सुराग दे सकता है?

+1

इसे 'कैश' कहा जाता है। – leppie

+3

सुराग: एक डेटा संरचना बनाएं जो यह – crashmstr

+0

करती है यदि आप एएसपीनेट का उपयोग कर रहे हैं, तो कैश कक्षाएं आपके लिए यह कर सकती हैं। –

उत्तर

7

आप इस तरह कुछ भी कोशिश कर सकते हैं।

एक कस्टम वर्ग

public class Custom 
    { 
     string item; //will hold the item 
     Timer timer; //will hanlde the expiry 
     List<Custom> refofMainList; //will be used to remove the item once it is expired 

     public Custom(string yourItem, int milisec, List<Custom> refOfList) 
     { 
      refofMainList = refOfList; 
      item = yourItem; 
      timer = new Timer (milisec); 
      timer.Elapsed += new ElapsedEventHandler(Elapsed_Event); 
      timer.Start(); 
     } 

     private void Elapsed_Event(object sender, ElapsedEventArgs e) 
     { 
      timer.Elapsed -= new ElapsedEventHandler(Elapsed_Event); 
      refofMainList.Remove(this); 

     } 
    } 

बनाएं अब आप List<Custom> बना सकते हैं और इसका इस्तेमाल कर सकते हैं। एक बार निर्दिष्ट समय खत्म हो जाने पर आइटम हटा दिए जाएंगे।

+0

इसी तरह के समाधान ने मेरे लिए बहुत अच्छा काम किया। मेरे मामले में, मैंने ConncurrentDictionary में कैश किए गए मानों को पकड़ने के लिए एक सिंगलटन बनाया। फिर मैं कैश किए गए मूल्यों को हर बार साफ़ करने के लिए समय घटना का उपयोग करता हूं। मैंने एक स्लाइडिंग समाप्ति का उपयोग किया। –

+2

यह दृष्टिकोण आईआईएस में चल रहे एएसपीनेट एपीआई में कैसे काम करेगा। मेरा मानना ​​है कि आईआईएस में चलने वाले टाइमर के साथ जटिलताएं हैं? – Zapnologica

3

आपको ऐसा ऑब्जेक्ट बनाना होगा जो इसे प्रबंधित कर सके।

इस बारे में सोचें कि प्रति आइटम को स्टोर करने की आवश्यकता होगी। असल में, डेटा (उदा। txtName), और एक समाप्ति समय। इसका मतलब है कि आपको शायद उस वर्ग या संरचना की आवश्यकता होगी जिसमें केवल 2 तत्व हैं।

आपका ExpiringList वर्ग उस प्रकार की एक सूची हो जाएगा।

अब आपके पास मूलभूत संरचना संरचना है (ExpiringListItem का संग्रह/सूची) आपको इस बारे में सोचना होगा कि आप किस ऑपरेशन का समर्थन करना चाहते हैं। वर्तमान में आपने AddToList सूचीबद्ध किया है, अन्य शायद सभी आइटमों पर निकालें, साफ़ करें, और शायद पुनरावृत्त हो जाएंगे।

केवल एक चीज अपने ExpiringList के लिए अद्वितीय एक सामान्य List<T> की तुलना में है कि आप स्वचालित रूप से समाप्त हो गई आइटम निकालना चाहते है। इसलिए यह आपके एक्सपिरिंगलिस्ट को इंटरफ़ेस IList<T> को कार्यान्वित करने और आंतरिक रूप से एक निजी सूची का उपयोग करने के लिए समझ में आता है, संभवतः आप अपनी सूची बना सकते हैं (और आवश्यकता से आपकी ExpiredListItem कक्षा) जेनेरिक।

मुश्किल हिस्सा है, समझ और लागू करने विरासत (एक अलग सवाल वास्तव में) से परे, बाहर काम कर रहा है की अवधि समाप्त हो आइटम निकालने का तरीका।

यह अपने आइटम पर अपने वर्ग कि दोहराया भीतर एक विधि (उलटे क्रम में) बनाने मतलब है, वर्तमान समय के साथ उनकी समाप्ति समय की तुलना और अवधि समाप्त हो लोगों को हटाने जाएगा।

आप अपनी आंतरिक सूची में उपयुक्त विधियों को कॉल करके इंटरफ़ेस को कार्यान्वित कर सकते हैं।

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

हो सकता है कि एक बेहतर विकल्प आंतरिक सूची पर विधि चलाने से पहले इस विधि कॉल करने के लिए किया जाएगा। इस पर निर्भर करते हुए कि आप अपनी सूची का उपयोग कैसे करेंगे, यह अधिक हो सकता है।

+1

संक्षेप में; मैं समय-समय पर समाप्त होने वाली वस्तुओं की जांच करने के लिए टाइमर का उपयोग करूंगा। –

+0

@Nime, जो काम करेगा, या आप मेरे पिछले पैराग्राफ में सुझाव का उपयोग कर सकते हैं (यदि आप एक वर्ग बनाना चाहते हैं जो सूची में काम करने वाली एक विधि के बजाय) प्रबंधित करता है)। –

21

यदि आप .NET 4 या ऊपर लक्षित कर रहे हैं, तो MemoryCache का उपयोग करें (या ObjectCache से अपना कस्टम कार्यान्वयन प्राप्त करें)।

वापस 4 से पहले, यदि आप अपने ऐप्लिकेशन में कैश चाहता था तो आप बस System.Web.Cache रोड़ा और उपयोग करने वाले सभी नेट अनुप्रयोग में कर सकता है। इसमें किसी भी "वेब" कोड पर वास्तविक निर्भरता नहीं थी, लेकिन इसके लिए आपको System.Web.dll संदर्भित करने की आवश्यकता थी। यह अजीब लग रहा था (माइक्रोसॉफ्ट के संदर्भ में। VisualBasic।एक सी # ऐप से डीएलएल), लेकिन वास्तव में आपके आवेदन को नकारात्मक रूप से प्रभावित नहीं किया था।

Client Profile के आगमन के साथ, डेस्कटॉप-केंद्रित कोड और सर्वर-केंद्रित कोड के बीच निर्भरता टूटना महत्वपूर्ण हो गया। तो ऑब्जेक्ट कैश पेश किया गया था ताकि डेस्कटॉप ऐप (Silverlight, wp7 के बारे में सुनिश्चित न हो) डेवलपर उस निर्भरता को तोड़ सकता है और केवल ग्राहक प्रोफ़ाइल को लक्षित करने में सक्षम हो सकता है।

+0

3.5 अभी तक। मैं ध्यान में रखूंगा। –

11

जवाब देंगे

संदर्भ जोड़ें दिया System.Runtime.Caching

करने के लिए बस एक त्वरित उदाहरण
MemoryCache cache = new MemoryCache("CacheName"); 

cache.Add(key, value, new CacheItemPolicy() 
          { AbsoluteExpiration = DateTime.UtcNow.AddSeconds(20) }); 

तो आप अगर कुछ

if (cache.Contains(key)) 
जाकर कैश में अब भी है जाँच कर सकते हैं

और यदि आप चाहते हैं कि आपके कैश में कम समय सीमा हो तो आपको कैश के ताज़ा समय को एक अच्छे छोटे हैक के साथ बदलना होगा।

MemoryCache AbsoluteExpiration acting strange

+0

क्या आपको एक समवर्ती स्मृति कैश मिलता है? मूल रूप से समाप्ति कार्यक्षमता के साथ सी # 'ConcurrentDictionary'? – Zapnologica

+2

@Zapnologica MemoryCache पूरी तरह से थ्रेडसेफ है, यह उत्तर देखें: http://stackoverflow.com/a/6738179/606554 – elbweb

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