C#实现生产和消费
public abstract class DoubleCache<T>
{
#region 双缓存机制
//也可使用环形buff机制
private ListAndLockSlim<T> lst1 = new ListAndLockSlim<T>();
private ListAndLockSlim<T> lst2 = new ListAndLockSlim<T>();
private bool flag = true;
public int Count
{
get
{
var lst = Getlist();//获取当前有效队列
try
{
lst.lockSlim.EnterUpgradeableReadLock();
return lst.Count;
}
finally
{
lst.lockSlim.ExitUpgradeableReadLock();
}
}
}
/// <summary>
/// 获取当前生效队列
/// </summary>
/// <returns></returns>
protected ListAndLockSlim<T> Getlist()
{
if (flag)
{
return lst1;
}
else
{
return lst2;
}
}
public virtual ListAndLockSlim<T> GetChange()
{
var lst = Getlist();//获取当前有效队列
flag = !flag;//翻转有效队列
try
{
lst.lockSlim.EnterUpgradeableReadLock();
return lst;
}
finally
{
lst.lockSlim.ExitUpgradeableReadLock();
}
//lock (lst)//防止出现正在操作过程中的问题
//{
//}
}
#endregion
//#region 保存近X条记录
//public List<T> LastData = new List<T>();
//#endregion
/// <summary>
/// 添加到数据源
/// </summary>
/// <param name="item"></param>
public void Add(T item)
{
var lst = Getlist();
try
{
lst.lockSlim.EnterReadLock();
lst.Add(item);
OnAdd(item);
}
finally
{
lst.lockSlim.ExitReadLock();
}
}
/// <summary>
/// 添加后执行方法
/// </summary>
/// <param name="item"></param>
protected abstract void OnAdd(T item);
/// <summary>
/// 切换数据源并执行DoSomething方法
/// </summary>
protected void SwitchAndDoSomething()
{
var lst = GetChange();
//Thread.Sleep(100);//暂停100ms,防止翻转时有在等待插入
try
{
lst.lockSlim.EnterUpgradeableReadLock();
lst.lockSlim.EnterWriteLock();
DoSomething(lst);
}
finally
{
lst.lockSlim.ExitWriteLock();
lst.lockSlim.ExitUpgradeableReadLock();
}
}
/// <summary>
///
/// </summary>
protected abstract void DoSomething(List<T> lst);
}
public class ListAndLockSlim<T> : List<T>
{
public ReaderWriterLockSlim lockSlim = new ReaderWriterLockSlim(LockRecursionPolicy.NoRecursion);
}
一起学习!
//监控性能需引用 System.Diagnostics //荣达2022.11.24测试代码,检测打印耗时 System.Diagnostics.Stopwatch stopwatch = new System.Diagnostics.Stopwatch()…
© 版权声明
THE END
暂无评论内容