Никогда не безопасно читать / писать без забора памяти. Если вы не блокируете, вам нужно объявить переменную свойства как volatile или использовать ограничитель памяти. Сделайте поиск в блоге Джо Даффи для получения дополнительной информации.
аюсь создать потокобезопасные свойства в C #, и я хочу убедиться, что я нахожусь на правильном пути - вот что я сделал -
private readonly object AvgBuyPriceLocker = new object();
private double _AvgBuyPrice;
private double AvgBuyPrice
{
get
{
lock (AvgBuyPriceLocker)
{
return _AvgBuyPrice;
}
}
set
{
lock (AvgBuyPriceLocker)
{
_AvgBuyPrice = value;
}
}
}
Читая эту публикацию, казалось бы, что это не правильный способ сделать это -
Безопасность потоков C # с get / set
Тем не менее, эта статья, кажется, предлагает иное,
http://www.codeproject.com/KB/cs/Synchronized.aspx
У кого-нибудь есть более точный ответ?
Редактировать:
Причина, по которой я хочу сделать Getter / Setter для этого свойства, заключается в том, что b / c я на самом деле хочу, чтобы оно запускало событие, когда оно установлено - поэтому код на самом деле был бы таким:
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);
}
}
}
}
Я довольно новичок в том, чтобы сделать мой поток кода безопасным, поэтому, пожалуйста, не стесняйтесь сказать мне, если я поступаю об этом совершенно неправильно!
Будет