13

我有以下代码:

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
   }
}

我不想让人们在从数据库加载数据时读取数据,因此我lockReadData. 但是,现在如果多人ReadData同时打电话,一次只能打一个电话。

有没有一种方法可以允许同时调用ReadDataLoadData在运行时阻止阅读器?

4

2 回答 2

14

ReaderWriterLockReaderWriterLockSlim类支持该用例。除非您需要 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();
    }
}
于 2012-10-17T01:51:21.363 回答
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
}

这允许多个读取器等待数据加载器完成其工作,然后同时读取。如果集合不是线程安全的,那么您需要添加另一个锁定对象或使用另一个同步构造。

于 2012-10-17T01:52:18.937 回答