使用 Asp.Net 4/c#
我想在内存中存储一个项目列表(我通常使用术语列表)而不是列表。我需要维护列表中项目的最后使用日期。
实际上我需要锁定,找到最早的日期,更新它并解锁并返回记录。
作为一个相对新手,我有几个问题:
- 存储数据的最佳方式是什么?
- 是否有记录的锁定模式可以用来确保线程安全。
使用 Asp.Net 4/c#
我想在内存中存储一个项目列表(我通常使用术语列表)而不是列表。我需要维护列表中项目的最后使用日期。
实际上我需要锁定,找到最早的日期,更新它并解锁并返回记录。
作为一个相对新手,我有几个问题:
根据您的描述,您想要的是一个队列和围绕该队列的锁定机制。队列是一个先进先出容器,这意味着对象将按照它们入队的顺序出队,从而保证您的更新顺序约束。至于同步约束,因为您想在锁内完成工作,所以您需要一个比队列更高级别的锁。像这样的东西应该可以解决问题,但需要以正确的方式使用,因为没有 dispose 的 LockingDequeu() 将永久锁定队列。
public class MyQueue<T>
{
private readonly Queue<T> internalQueue = new Queue<T>();
private readonly object queueLocker = new object();
public Enqueue(T data)
{
internalQueue(data);
}
public IDisposable LockingDequeue(out T data)
{
var queueLock = new QueueLock(queueLocker);
data = internalQueue.Dequeue();
return queueLock;
}
private class QueueLock :IDisposable
{
private readonly object lockObject;
public QueueLock(object lockObject)
{
this.lockObject = lockObject;
Monitor.Enter(lockObject);
}
public void Dispose()
{
Monitor.Exit(lockObject);
}
}
}
了解LockingDequeue
调用需要在 using 块中使用。但是调用语法看起来像这样:
var myQueue = new MyQueue<object>();
object obj;
using(myQueue.LockingDequeue(out obj))
{
//update date
//do some work
myQueue.Enqueue(obj);
}