-1

使用 Asp.Net 4/c#

我想在内存中存储一​​个项目列表(我通常使用术语列表)而不是列表。我需要维护列表中项目的最后使用日期。

实际上我需要锁定,找到最早的日期,更新它并解锁并返回记录。

作为一个相对新手,我有几个问题:

  • 存储数据的最佳方式是什么?
  • 是否有记录的锁定模式可以用来确保线程安全。
4

1 回答 1

1

根据您的描述,您想要的是一个队列和围绕该队列的锁定机制。队列是一个先进先出容器,这意味着对象将按照它们入队的顺序出队,从而保证您的更新顺序约束。至于同步约束,因为您想在锁内完成工作,所以您需要一个比队列更高级别的锁。像这样的东西应该可以解决问题,但需要以正确的方式使用,因为没有 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);
}
于 2013-05-17T17:34:36.757 回答