que estoy tratando de crear propiedades de seguridad de rosca en C# y que quieren asegurarse de que estoy en el camino correcto - esto es lo que he hecho -rosca Propiedades seguras en C#
private readonly object AvgBuyPriceLocker = new object();
private double _AvgBuyPrice;
private double AvgBuyPrice
{
get
{
lock (AvgBuyPriceLocker)
{
return _AvgBuyPrice;
}
}
set
{
lock (AvgBuyPriceLocker)
{
_AvgBuyPrice = value;
}
}
}
La lectura de esta publicación, parecería como si esto no es la forma correcta de hacerlo -
sin embargo, este artículo parece sugerir lo contrario,
http://www.codeproject.com/KB/cs/Synchronized.aspx
¿Alguien tiene una respuesta más definitiva?
Editar:
La razón por la que yo quiero hacer el captador/definidor de esta propiedad es b/c que realmente quiero para disparar un evento cuando se establece - por lo que el código podría ser en realidad como este -
public class PLTracker
{
public PLEvents Events;
private readonly object AvgBuyPriceLocker = new object();
private double _AvgBuyPrice;
private double AvgBuyPrice
{
get
{
lock (AvgBuyPriceLocker)
{
return _AvgBuyPrice;
}
}
set
{
lock (AvgBuyPriceLocker)
{
Events.AvgBuyPriceUpdate(value);
_AvgBuyPrice = value;
}
}
}
}
public class PLEvents
{
public delegate void PLUpdateHandler(double Update);
public event PLUpdateHandler AvgBuyPriceUpdateListener;
public void AvgBuyPriceUpdate(double AvgBuyPrice)
{
lock (this)
{
try
{
if (AvgBuyPriceUpdateListener!= null)
{
AvgBuyPriceUpdateListener(AvgBuyPrice);
}
else
{
throw new Exception("AvgBuyPriceUpdateListener is null");
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
}
}
soy bastante nuevo para hacer mi hilo código de seguridad así que por favor libre de decirme si voy sobre él en el camino totalmente equivocado!
Will
Está bien. No lo veo, por qué piensas que no es así. La respuesta de SO vinculada no indica que es una mala idea hacerlo así. –
var propiedad = new ConcurrentValue(); property.ReadValue (x => { // use este valor seguro de subproceso x }); property.WriteValue (() => { // complejo cómputo de bloqueo que consume mucho tiempo return "Computed"; }); } puede crear una clase ConcurrentValue para usar como un titular de valor de propiedad con funcionalidad de bloqueo para escribir y hacer múltiples lecturas exclusivamente - Object.Property.Write ((= => cálculo que consume tiempo) // bloquea Object.Property.Read (x =>) –