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

データベースからロードされている間、他の人にデータを読み取らせたくないので、に入れlockますReadData。ただし、現時点では、複数の人ReadDataが同時に電話をかけた場合、一度に実行できる電話は1つだけです。

実行中にリーダーへの同時呼び出しを許可するReadDataが、リーダーをブロックする方法はありLoadDataますか?

4

2 に答える 2

14

ReaderWriterLockおよびReaderWriterLockSlimクラスは、そのユースケースをサポートします。3.5より前のサポートが必要でない限り、「スリム」バージョンを使用してください。

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 に答える