我有以下代码:
private static object _dbLock = new object();
public static void LoadData()
{
lock (_dbLock)
{
//Load data from the database
}
}
public static string ReadData(Guid key)
{
lock (_dbLock)
{
//Lookup key in data and return value
}
}
我不想让人们在从数据库加载数据时读取数据,因此我在lock
中添加了ReadData
。但是,现在如果有多个人同时拨打ReadData
,则只能同时拨打一个电话。
我是否有办法允许同时拨打ReadData
,但在LoadData
运行时阻止读者?
答案 0 :(得分:13)
ReaderWriterLock
和ReaderWriterLockSlim
类支持该用例。除非您需要3.5之前的支持,否则请使用“Slim”版本。
private static ReaderWriterLockSlim _cacheLock = new ReaderWriterLockSlim();
public static void LoadData()
{
_cacheLock.EnterWriteLock();
try
{
// Load data from the database
}
finally
{
_cacheLock.ExitWriteLock();
}
}
public static string ReadData(Guid key)
{
_cacheLock.EnterReadLock();
try
{
// Lookup key in data and return value
}
finally
{
_cacheLock.ExitReadLock();
}
}
答案 1 :(得分:1)
尝试使用ManualResetEvent
:
private static object _dbLock = new object();
private static ManualResetEvent _mrse = new ManualResetEvent(true);
public static void LoadData()
{
lock (_dbLock)
{
_mrse.Reset();
//Load data from the database
_mrse.Set();
}
}
public static string ReadData(Guid key)
{
_mrse.Wait();
//Lookup key in data and return value
}
这允许多个读者等待数据加载器完成其工作然后同时读取。如果集合不是线程安全的,那么您需要添加另一个锁定对象或使用另一个同步构造。