Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 需要在内存存储中部署单线程_C#_Asp.net_Thread Safety - Fatal编程技术网

C# 需要在内存存储中部署单线程

C# 需要在内存存储中部署单线程,c#,asp.net,thread-safety,C#,Asp.net,Thread Safety,使用Asp.NET4/c# 我想在内存中存储项目列表(我一般使用术语列表),而不是列表。我需要为列表中的项目保留最后使用的日期 有效地,我需要锁定,找到最早的日期,更新它,解锁并返回记录 作为一个相对新手,我有几个问题: 存储数据的最佳方式是什么 是否有记录在案的锁定模式,我可以使用,以确保线程 安全 根据您的描述,您需要的是一个队列&一个围绕该队列的锁定机制。队列是一个先进先出的容器,这意味着对象将按照其排队的顺序退出队列,从而保证您的更新顺序约束。至于同步约束,因为您希望在锁内部执行工作,

使用Asp.NET4/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);
        }
    }
}

可能的dup:线程没有回答所问的问题。它显示了一个可锁定的列表,并没有回答此处问题的第一部分。“最佳方式…”问题需要您对“更好”的定义。否则,它应该被关闭。至少解释一下为什么您当前使用的数据结构(哪种?)不适合您的需要。
var myQueue = new MyQueue<object>();
object obj;
using(myQueue.LockingDequeue(out obj))
{
    //update date
    //do some work
    myQueue.Enqueue(obj);
}