Uzun süre Asp.Net' te yazınca, masaüstü uygulaması yazarken de insan garip bir şekilde her şeyin daha rahat ve kolay olduğu bu platformda webdeki bazı mekanizmaları arıyor. Malum web uygulamalarında stateless bir ortamdasınızdır yani siz istemeseniz de nesneleriniz sayfanın istemciye gönderilmesiyle yok olurlar. Tabi bazı tedbirler alarak bunun önüne geçmek mümkün. Tüm istemcilerin yükünü sunucuya atamayacağınız için sadece sık kullanılan ya da benzeri sebeplerle özel olan nesneleri~verileri değişik şekillerde cache leriz. Asp.Net' te verileri saklamayı en sevdiğim yollardan birisi de cache dir. HttpContext.Current.Cache.Insert() ile verileri belirli bir süre sonra zamanaşımına uğrayarak memoryden silinecek şekilde saklayabiliriz. Bu bize memory sıkıntısı çekmemek ve belirli bir süre sonra boşalan verileri tekrar doldurarak verileri tazelemiş olma imkanı tanır. İşte alışık olduğum ve sevdiğim bu mekanizmaya winforms uygulamalarında da gerçekleştirebilmek için birazdan winforms için çakma :) bir cacheleme örneği vermeye çalışacağım. Peşin peşin söyliyeyim ki kod henüz çok yeni ve bu sebeple de beklenmedik hatalara vs sebep olabilir.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
public class CacheManager
{
static System.Collections.Hashtable ht = new System.Collections.Hashtable();
public static void AddItem(string key, object value, uint timeToCache)
{
if (timeToCache > 3600)
throw new ArgumentOutOfRangeException("Cache süresi 1 saatten uzun olamaz.");
System.Threading.Timer t = new System.Threading.Timer(new TimerCallback(TimerProc));
t.Change(timeToCache * 1000, System.Threading.Timeout.Infinite);
ht.Add(t, key);
AppDomain.CurrentDomain.SetData(key, value);
}
public static object GetItem(string key)
{
return AppDomain.CurrentDomain.GetData(key);
}
private static void TimerProc(object state)
{
System.Threading.Timer t = state as System.Threading.Timer;
if (t != null)
{
object key = ht[t];
ht.Remove(t);
t.Dispose();
if (key != null)
AppDomain.CurrentDomain.SetData(key.ToString(), null);
}
}
}
Gelelim kullanımına;
CacheManager.AddItem(cacheKey, myDataTable, 300);