2011-05-04 16 views
5

मैं एक मापन यंत्र वस्तु है सी # में ताला के लिए प्रथाओं (या दर्ज करें/बाहर निकलें):बेस्ट

public class Device 
{ 
    public Instrument MeasuringInstrument { get; set; } 
    public void DoMeasuring() 
    { 
    var result = this.MeasuringInstrument.Measure(); 
    } 
} 

मापन यंत्र:

public class Instrument 
{ 
    public double Measure() 
    { 
    return 0; 
    } 
} 

मैं किसी उपकरण कुछ मापने के लिए जरुरी है कि है केवल एक ही समय में एक डिवाइस पर काम कर सकता है, फिर भी कई डिवाइस एक ही उपकरण का उपयोग कर सकते हैं। मैं थ्रेडिंग के लिए नया हूं, और जो मैं समझता हूं, दोनों में से दोनों समाधानों में चेतावनी है।

public class Instrument 
{ 
    public double Measure() 
    { 
    lock(this) 
    { 
     return 0; 
    } 
    } 
} 

public class Device 
{ 
    public Instrument MeasuringInstrument { get; set; } 
    public void DoMeasuring() 
    { 
    lock(this.MeasurementInstrument) 
    { 
     var result = this.MeasuringInstrument.Measure(); 
    } 
    } 
} 

मैं इसे निजी वस्तुओं पर लॉक करने के लिए सबसे अच्छा है पढ़ा है, लेकिन मैं कैसे कि जबकि अभी भी MeasuringInstrument मिल/डिवाइस पर सेट करने के लिए अनुमति करने के लिए पता नहीं है। कोई सुझाव?

धन्यवाद ज्यादा,
केन

+0

भावी पीढ़ियों के लिए: प्रबंधित थ्रेडिंग उत्तम आचरण http://msdn.microsoft.com/en-us/library/1c9txz50(v=vs.110).aspx – Brad

उत्तर

3

सामान्य पैटर्न बनाने के लिए है अपने निजी object सिर्फ मामले में जहां स्वाभाविक पसंद वर्ग के बाहर उजागर किया जा सकता है में ताला लगा, उदाहरण के लिए के लिए:

public class Instrument 
{ 
    private object thisLock = new object(); 

    public double Measure() 
    { 
     lock(this.thisLock) 
     { 
      return 0; 
     } 
    } 
} 

public class Device 
{ 
    public Instrument MeasuringInstrument { get; set; } 
    private object measuringInstrumentLock = new object(); 

    public void DoMeasuring() 
    { 
     lock(this.measuringInstrumentLock) 
     { 
      var result = this.MeasuringInstrument.Measure(); 
     } 
    } 
} 

इसके अलावा, मुझे संदेह है कि आपको केवल उन दो ताले में से एक की आवश्यकता है (या तो DoMeasuring में से एक या Measure में से एक) हालांकि यह लापता बिट्स पर निर्भर करता है।

+0

डिवाइस में दूसरा ताला आवश्यकता नहीं है। –

+0

hii .. मैं थ्रेडिंग और लॉकिंग में नया हूं ... निजी वस्तुओं पर लॉक का उपयोग करें .. यह ठीक है। लेकिन कृपया मुझे बताएं कि वास्तव में "लॉक" क्या करता है। मेरा मतलब है कि अगर उपकरण कक्षा के 10 ऑब्जेक्ट्स हैं तो प्रत्येक ऑब्जेक्ट में मापन() की अपनी प्रतिलिपि होगी। अब, लॉक का उद्देश्य क्या है? – himanshu

+1

@ हिमांशु इस पर ध्यान दें: http://msdn.microsoft.com/en-us/library/c5kehkcz.aspx –

5

अपने instrument कई द्वारा प्रयोग किया जाता है, तो devices सबसे अच्छा अभ्यास अपने instrument कक्षा में lock स्थापित करने के लिए है। तो मुट्ठी समाधान बेहतर काम करता है।

लेकिन यह एक नया लॉक ऑब्जेक्ट बनाने और instrument कक्षा में इसका उपयोग करने के लिए बेहतर है।

public class Instrument 
{ 
    Object lockKey = new Object(); 
    public double Measure() 
    { 
    lock(lockKey) 
    { 
     return 0; 
    } 
    } 
} 
+1

@frazin। मैं सहमत हूं लेकिन एक बेहतर जवाब यह बेहतर होगा कि यह बेहतर क्यों होगा –

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