Thread Safe Properties en C #

Estoy tratando de crear propiedades seguras para subprocesos en C # y quiero asegurarme de que estoy en el camino correcto; esto es lo que he hecho:

private readonly object AvgBuyPriceLocker = new object();
private double _AvgBuyPrice;
private double AvgBuyPrice 
{
    get
    {
        lock (AvgBuyPriceLocker)
        {
            return _AvgBuyPrice;
        }
    }
    set
    {
        lock (AvgBuyPriceLocker)
        {
            _AvgBuyPrice = value;
        }
    }
}

Leyendo esta publicación, parecería que esta no es la forma correcta de hacerlo -

C # seguridad de rosca con get / set

sin embargo, este artículo parece sugerir lo contrario,

http: //www.codeproject.com/KB/cs/Synchronized.asp

Alguien tiene una respuesta más definitiva?

Editar

La razón por la que quiero hacer el Getter / Setter para esta propiedad es b / c. Realmente quiero que active un evento cuando está configurado, por lo que el código sería así:

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 que mi hilo de código sea seguro, así que siéntase libre de decirme si lo estoy haciendo de una manera totalmente incorrecta!

Ser

Respuestas a la pregunta(4)

Su respuesta a la pregunta