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