锁定将允许C#中的多个读者

时间:2012-10-17 01:45:27

标签: c# .net multithreading locking

我有以下代码:

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运行时阻止读者?

2 个答案:

答案 0 :(得分:13)

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();
    }
}

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

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

相关问题