рд╢реБрдн рджреЛрдкрд╣рд░
рдпрд╣ рдПрдХ рдмрд╣реБрдд рд╣реА рдЖрджрд┐рдо рдХреИрд╢ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣рд╛рдВ рд▓реЗ рдЧрдпрд╛, рддрд╛рдХрд┐ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдПрдХ рдмрд╛рд░ рдлрд┐рд░ рд╕реЗ рдЪрдврд╝ рди рдЬрд╛рдПред рдЗрд╕реА рд╕рдордп, рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдбреЗрдЯрд╛ рд╕реНрдерд┐рд░ рд╣реИ, рдФрд░ рд╕рд╡рд╛рд▓ рдбреЗрдЯрд╛ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЗрддрдирд╛ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕реЗ рдХрдм рдлреЗрдВрдХрдирд╛ рд╣реИ, рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╕ рдореЗрдореЛрд░реА рдкрд░ рдХрдмреНрдЬрд╛ рдирд╣реАрдВ рдХрд░рдирд╛ рд╣реИ, рдФрд░ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧ рдореЗрдВ рдЖрд╕рд╛рдиреА рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рдореИрдВ рдореЗрдореЛрд░реАрдХреИрдЪ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛, рд▓реЗрдХрд┐рди рдпрд╣ рдореБрдЭреЗ рдмрд╣реБрдд рдЙрд▓рдЭрди рдореЗрдВ рд▓рдЧ рд░рд╣рд╛ рдерд╛, рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рд╕рдЦреНрдд рдЯрд╛рдЗрдкрд┐рдВрдЧ рдХреЗ рдмрд┐рдирд╛ рднреАред
рдореИрдВ рдмрд┐рд▓реНрд▓реА рдХреЗ рдиреАрдЪреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдкреВрдЫрддрд╛ рд╣реВрдВред
рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди
рд╕рд╛рдорд╛рдиреНрдп рд╡рд┐рдЪрд╛рд░ рдпрд╣ рд╣реИ: рдХреИрд╢ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдФрд░ рдкрд╛рд░рджрд░реНрд╢реА рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдореИрдВ рдереНрд░реЗрдбрд▓реЛрдХрд▓ рдХреНрд▓рд╛рд╕ рдХреЗ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╕реЗ рдкреНрд░реЗрд░рд┐рдд рдерд╛ред рдЗрд╕рд▓рд┐рдП, рдирд┐рд░реНрдорд╛рддрд╛ рдХреЛ рдореВрд▓ рдореВрд▓реНрдпреЛрдВ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдХрд╛рд░рдЦрд╛рдирд╛ рд╡рд┐рдзрд┐ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдФрд░ рдлрд┐рд░ рд╡реЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХреИрд╢ рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВред рдлрд┐рд░ рд╕реЗ, рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдореБрдЭреЗ рдбреЗрдЯрд╛ рдХреЛ рдХрдордЬреЛрд░ рд▓рд┐рдВрдХ (WeakReference) рдкрд░ рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рдлреА рддрд░реНрдХрд╕рдВрдЧрдд рдкрд╛рдпрд╛ рдЧрдпрд╛, рдЗрд╕рд▓рд┐рдП рдЬрдм рдбреЗрдЯрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рддреЛ рдХреЛрдИ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдпрд╣ рдЙрдкрд▓рдмреНрдз рд╣реЛрдЧрд╛ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЬреИрд╕реЗ рд╣реА рдирдИ рдореЗрдореЛрд░реА рдЖрд╡рдВрдЯрд┐рдд рдХреА рдЬрд╛рддреА рд╣реИ, рдХреИрд╢ рд╕реЗ рдбреЗрдЯрд╛ рдХреЛ рдордЬрдмреВрд░ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рдХреЗрд╡рд▓ рджреЛ рд╡рд┐рдзрд┐рдпрд╛рдБ рд╣реИрдВ: рдПрдХ рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛ рдЬреЛ рд╕реНрд░реЛрдд рд╕реЗ рдпрд╛ рдХреИрд╢ рд╕реЗ рдбреЗрдЯрд╛ рд▓реМрдЯрд╛рддреА рд╣реИред
рд╕рд╛рде рд╣реА CleanCache рд╡рд┐рдзрд┐, рдореГрдд рд▓рд┐рдВрдХ рдХреЗ рд╢рдмреНрджрдХреЛрд╢ рдХреЛ рдЦрд╛рд▓реА рдХрд░рдиреЗ рдФрд░ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдореЗрдореЛрд░реА рд▓реАрдХ рдХреЛ рдЦрддреНрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкрд░рд┐рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ, рдпрд╣ рд╣рдореЗрд╢рд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдореЗрд░реА рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ, рдХреИрд╢ рдореЗрдВ рдирдИ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐рдпрд╛рдВ рджрд┐рди рдореЗрдВ рдХреЗрд╡рд▓ рдХрдИ рдмрд╛рд░ рджрд┐рдЦрд╛рдИ рджреЗрдВрдЧреА, рдЗрд╕рд▓рд┐рдП рдСрдкрд░реЗрд╢рди рдХреЗ рд╡рд░реНрд╖реЛрдВ рдореЗрдВ рднреА рд▓рд┐рдВрдХ рдХрд┐рд╕реА рднреА рдорд╣рддреНрд╡рдкреВрд░реНрдг рдорд╛рддреНрд░рд╛ рдореЗрдВ рдореЗрдореЛрд░реА рдирд╣реАрдВ рдЦрд╛рдПрдВрдЧреЗред
рдкреНрд░рдХрд╛рд╢рди рдХрд╛ рдЙрджреНрджреЗрд╢реНрдп
рдореВрд▓ рд░реВрдк рд╕реЗ, рдореИрдВ рдЕрдкрдиреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рд░рд╛рдп рд╕реБрдирдиреЗ рдореЗрдВ рджрд┐рд▓рдЪрд╕реНрдкреА рд░рдЦрддрд╛ рд╣реВрдВ, рдЕрдЧрд░ рдХреЛрдИ рддреНрд░реБрдЯрд┐ рд╣реЛ рддреЛ рдЖрдк рдХреИрд╕реЗ рдХрд░реЗрдВрдЧреЗред рдЦреИрд░, рдЕрдЧрд░ рдпрд╣ рдХрд┐рд╕реА рдХреА рдорджрдж рдХрд░рддрд╛ рд╣реИ - рдЗрд╕реЗ рд▓реЗ рд▓реЛ, рдЗрд╕рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░реЗрдВ :)
рд╕реНрд░реЛрдд рдХреЛрдб
public class WeakCache<TKey,TValue> where TValue : class { const int cacheCleanInterval = 60; private readonly Func<TKey, TValue> getter; private readonly Dictionary<TKey, WeakReference> data = new Dictionary<TKey, WeakReference>(); private readonly ReaderWriterLockSlim rwLock = new ReaderWriterLockSlim(); private DateTime lastCacheClean = DateTime.MinValue; public WeakCache(Func<TKey,TValue> getter) { this.getter = getter; } public TValue this[TKey key] { get { CleanCache(); try { rwLock.EnterUpgradeableReadLock(); WeakReference wr; TValue val; if (data.TryGetValue(key, out wr)) { val = (TValue)wr.Target; if (val != null) return val; } try { rwLock.EnterWriteLock(); if (data.TryGetValue(key, out wr)) { val = (TValue)wr.Target; if (val != null) return val; } data[key] = new WeakReference(val = getter(key)); return val; } finally { rwLock.ExitWriteLock(); } } finally { rwLock.ExitUpgradeableReadLock(); } } } void CleanCache() { if ((DateTime.Now - lastCacheClean).TotalSeconds > cacheCleanInterval) { try { rwLock.EnterWriteLock(); if ((DateTime.Now - lastCacheClean).TotalSeconds > cacheCleanInterval) { lastCacheClean = DateTime.Now; var refs = data.ToArray(); foreach (var weakReference in refs) { if (!weakReference.Value.IsAlive) data.Remove(weakReference.Key); } } } finally { rwLock.ExitWriteLock(); } } } }