2011-05-04 9 views
5

que tengo un objeto instrumento de medida:Mejores prácticas para bloquear (o entrar/salir) en C#

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

que tienen un dispositivo que tiene que hacer alguna medición:

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

El instrumento de medición solo puede operar en un dispositivo a la vez, sin embargo, muchos dispositivos pueden usar el mismo instrumento. Soy nuevo en el roscado, y por lo que entiendo, las dos soluciones siguientes tienen salvedades.

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

He leído que es mejor para bloquear en objetos privados, pero no sé cómo hacerlo, al tiempo que permite la MeasuringInstrument sea get/set en el dispositivo. ¿Alguna sugerencia?

Gracias mucho,
Ken

+0

para las generaciones futuras: Gestionado roscado Buenas Prácticas http://msdn.microsoft.com/en-us/library/1c9txz50(v=vs.110).aspx – Brad

Respuesta

3

el patrón habitual es crear su propia privada object sólo por el bloqueo en el caso de que la opción obvia podría estar expuesta fuera de la clase, por ejemplo:

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

Además, sospecho que solo necesita uno de esos dos bloqueos (el de DoMeasuring o el de Measure), aunque eso depende de los bits que faltan.

+0

no se requiera la segunda cerradura de dispositivos. –

+0

hii .. Soy nuevo en enhebrar y bloquear ... Usar bloqueo en objetos privados ... está bien. Pero dígame qué hace realmente "bloqueo". Quiero decir, si hay 10 objetos de la clase Instrument, entonces cada objeto tendría su propia copia de Measure(). Ahora, ¿cuál es el propósito de la cerradura? – himanshu

+1

@himanshu mira esto: http://msdn.microsoft.com/en-us/library/c5kehkcz.aspx –

5

si su instrument es utilizado por múltiples devices la mejor práctica es fijar lock en su clase instrument. entonces la primera solución funciona mejor.

pero es mejor crear un nuevo objeto de bloqueo y usarlo en la clase instrument.

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

@frazin. Estoy de acuerdo, pero una mejor respuesta incluiría por qué es mejor –

Cuestiones relacionadas