विधि # 1:
सरल और कम से कम प्रभावी तरीका पाठकों और लेखकों के लिए एक महत्वपूर्ण अनुभाग बनाने के लिए है।
// Writer
lock (aList)
{
aList.Remove(item);
}
// Reader
lock (aList)
{
foreach (T name in aList)
{
name.doSomething();
}
}
विधि # 2:
यह # 1 विधि के समान है, लेकिन foreach
पाश की पूरी अवधि के लॉक रोक के बजाय आप संग्रह पहले कॉपी और फिर से अधिक पुनरावृति प्रति।
// Writer
lock (aList)
{
aList.Remove(item);
}
// Reader
List<T> copy;
lock (aList)
{
copy = new List<T>(aList);
}
foreach (T name in copy)
{
name.doSomething();
}
विधि # 3:
यह सब अपने विशिष्ट स्थिति पर निर्भर करता है, लेकिन जिस तरह से मैं सामान्य रूप से इस समस्या से निपटने संग्रह अपरिवर्तनीय करने के लिए मास्टर संदर्भ रखने के लिए है। इस तरह आपको पाठक पक्ष पर पहुंच को सिंक्रनाइज़ नहीं करना पड़ता है। चीजों के लेखक पक्ष को lock
की आवश्यकता है। पाठक पक्ष को कुछ भी नहीं चाहिए जिसका अर्थ है कि पाठक अत्यधिक समवर्ती रहते हैं। आपको केवल एक चीज करने की आवश्यकता है aList
संदर्भ volatile
के रूप में संदर्भित करें।
// Variable declaration
object lockref = new object();
volatile List<T> aList = new List<T>();
// Writer
lock (lockref)
{
var copy = new List<T>(aList);
copy.Remove(item);
aList = copy;
}
// Reader
List<T> local = aList;
foreach (T name in local)
{
name.doSomething();
}
स्रोत
2012-04-04 20:01:06
धन्यवाद, एक आकर्षण की तरह काम करता :) चलो आशा है कि मैं का उपयोग कर किसी भी प्रदर्शन की समस्याओं नहीं मिलेगा .. –