2012-10-17 8 views
12

मैं निम्नलिखित कोड है:लॉक कि सी # में कई पाठकों की अनुमति देगा

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 चलाए जाने पर पाठकों को अवरुद्ध कर सकता है?

उत्तर

13

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

जानना अच्छा है। सुन्दर सामान! – joshgo

+0

सही दिखता है! मुझे लगा कि .NET Framework में ऐसा कुछ होगा। –

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 
} 

यह अनुमति देता है कई पाठकों डेटा लोडर के लिए प्रतीक्षा अपना काम खत्म करने के लिए और फिर एक साथ पढ़ने के लिए। यदि संग्रह थ्रेड सुरक्षित नहीं है, तो आपको एक और लॉकिंग ऑब्जेक्ट जोड़ने या किसी अन्य सिंक्रनाइज़ेशन निर्माण का उपयोग करने की आवश्यकता है।

+0

यह एक अच्छा जवाब भी है, हालांकि मैं * विश्वास करता हूं * अगर किसी को डेटा लोड होने पर 'लोडडाटा()' कहा जाता है, तो संभावित रूप से कुछ समस्याएं हो सकती हैं। मैं डेटा लोड होने के दौरान सबकुछ अवरुद्ध करना चाहता हूं। –

+0

@ माइक क्रिस्टेनसेन अच्छा बिंदु, जैसा कि आपने बताया है: यह केवल एक विकल्प है जो कुछ टंकण के साथ काम कर सकता है। – Kiril

संबंधित मुद्दे

 संबंधित मुद्दे