Kilit

2012-10-17 30 views
12

Aşağıdaki kod var:Kilit

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

ben böylece ben bir lock koymak, bu veritabanından yüklenen esnada insanlar veri okumak için izin vermek istemiyoruz ReadData. Ancak, şu anda birden fazla kişi aynı anda ReadData numaralı telefonu ararsa, tek seferde yalnızca bir çağrı başlayabilir.

ReadData eş zamanlı çağrılara izin vermenin bir yolu var, ancak LoadData çalıştırıldığında okuyucuları engelle?

cevap

13

ReaderWriterLock ve ReaderWriterLockSlim sınıfları, kullanım durumunu desteklemektedir. 3.5 öncesi desteğe ihtiyacınız olmadıkça 'İnce' sürümünü kullanın.

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

Bilmekte fayda var. Güzel şeyler! – joshgo

+0

Mükemmel görünüyor! .NET Framework'de bunun gibi bir şey olacağını düşündüm. –

1

ManualResetEvent kullanmayı deneyin: Bu veriyor

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 
} 

birden okuyucular çalışmalarını bitirmek için veri yükleyici bekleyin ve daha sonra aynı anda okumak için. Koleksiyon iş parçacığı güvenli değilse, başka bir kilitleme nesnesi eklemeniz veya başka bir senkronizasyon yapısı kullanmanız gerekir.

+0

Bu iyi bir cevaptır, ancak * inanıyorum ki * birisi veri okurken 'LoadData()' diye adlandırılırsa, bazı sorunlar olabilir. Veri yüklenirken her şeyin engellenmesini istiyorum. –

+0

@MikeChristensen iyi bir nokta, belirttiğiniz gibi: bu sadece biraz tinkering ile çalışabilecek bir alternatif. – Kiril

İlgili konular