Tôi cố gắng để tạo chủ đề tính an toàn trong C# và tôi muốn chắc chắn rằng tôi trên con đường đúng - đây là những gì tôi đã làm -Chủ đề Thuộc tính an toàn trong C#
private readonly object AvgBuyPriceLocker = new object();
private double _AvgBuyPrice;
private double AvgBuyPrice
{
get
{
lock (AvgBuyPriceLocker)
{
return _AvgBuyPrice;
}
}
set
{
lock (AvgBuyPriceLocker)
{
_AvgBuyPrice = value;
}
}
}
Reading gửi bài này, nó sẽ có vẻ như nếu đây không phải là cách chính xác để làm việc đó -
tuy nhiên, bài viết này dường như đề nghị ngược lại,
http://www.codeproject.com/KB/cs/Synchronized.aspx
Có ai có câu trả lời dứt khoát hơn không?
Edit:
Lý do mà tôi muốn làm các getter/setter cho thuộc tính này là b/c tôi thực sự muốn nó bắn một sự kiện khi nó được thiết lập - vì vậy mã thực sự sẽ là như thế này -
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);
}
}
}
}
Tôi khá mới làm cho chuỗi mã của mình an toàn vì vậy vui lòng cho tôi biết nếu tôi thực hiện theo cách hoàn toàn sai!
Will
OK. Tôi không thấy, tại sao bạn nghĩ nó không phải. Câu trả lời SO liên kết không chỉ ra rằng đó là một ý tưởng tồi để làm điều đó như thế này. –
var property = new ConcurrentValue(); property.ReadValue (x => { // sử dụng chủ đề này an toàn giá trị x }); property.WriteValue (() => { // tính toán chặn tốn thời gian phức tạp trả về "Được tính"; }); } bạn có thể tạo một lớp ConcurrentValue để sử dụng như một giá trị thuộc tính với chức năng khóa để ghi độc quyền và thực hiện nhiều lần đọc - Object.Property.Write (() => tính toán thời gian) // chặn Object.Property.Read (x =>) –