有好位仁兄写过这方面的东西,请指异一下.
顺便看下我下面的缓存类是否可行./// <summary>
/// 数据缓存保存信息异步处理委托
/// </summary>
delegate  void EventSaveCache(object key,object value);
/// <summary>
/// Cache 的摘要说明。
/// </summary>
public class Cache
{
public Cache()
{
//
// TODO: 在此处添加构造函数逻辑
//
}
protected  System.Collections.Hashtable _Cache = new System.Collections.Hashtable();
public virtual object GetObject(object key)
{
if(_Cache.ContainsKey(key))
return _Cache[key];
return null;
}
public  void SaveCaech(object key,object value)
{
EventSaveCache save = new EventSaveCache(SetCache);
IAsyncResult ar = save.BeginInvoke(key,value,new System.AsyncCallback(Results),null);
}
private  void Results(IAsyncResult ar)
{
EventSaveCache fd = (EventSaveCache)((AsyncResult)ar).AsyncDelegate;
fd.EndInvoke(ar);
}
protected  virtual void SetCache(object key ,object value)
{
lock(_Cache.SyncRoot)
{
if(!_Cache.ContainsKey(key))
_Cache.Add(key,value);
}
}
public void DelObject(object key)
{
lock(_Cache.SyncRoot)
{
_Cache.Remove(key);
}
}
public void Clear()
{
_Cache.Clear();
}
} public class CachePersistentCommand:Cache
{
private int mBuffer = 5;
/// <summary>
/// 获取或设置缓存的数量
/// 默认值是5
/// </summary>
public int Buffer
{
get
{
return mBuffer;
}
set
{
mBuffer = value;
}
}
protected override void SetCache(object key, object value)
{
System.Collections.IList _list;
if(_Cache.ContainsKey(key))
{
_list = (System.Collections.IList)_Cache[key];
if(_list.Count < this.Buffer)
_list.Add(value);
}
else
{
_list = new System.Collections.ArrayList();
_list.Add(value);
_Cache.Add(key,_list);
}
}
public override object GetObject(object key)
{

if(_Cache.Contains(key))
{
foreach(IPersistentCommand cmd in (System.Collections.IList)_Cache[key])
{
if(!cmd.State)
if(cmd.Lock())
return cmd;
}
}
return null;
}
}

解决方案 »

  1.   

    粗略得看没什么大问题。不过有一个值得注意的地方,
    lock(_Cache.SyncRoot)
    写缓存,我觉得这个问题很常见。你在这里同步了整个HashTable,这个是不合理的!
    如果说两个线程同时访问缓存,那么势必会只让一个访问,另一个在等。
    既然是缓存,那么一定会是放频繁访问的对象,那么你这样同步就非常影响效率了!正确的做法,我觉得应该是每次写操作的时候不用同步整个hashTable,而只同步需要访问的key。
      

  2.   

    jFresH_MaN(Contributing to Eclipse) 谢谢
      

  3.   

    还有就是假如我同步KEY
    _Cache.ContainsKey(key)这步操作是否有影响?
      

  4.   

    还有就是假如我同步KEY
    _Cache.ContainsKey(key)这步操作是否有影响?
    ---------
    这个当然会有影响的,形象就是当key被锁的时候就需要先wait,然后解锁之后再返回结果。
    其实你那样锁 HashTable还是一样的会锁住里面所有的key的。
      

  5.   

    看了一下MSDN上应用,在类里面定义一个object ,在代码中lock这个object就可以了
    这样就不用对hashtable上锁了.