我有养育锁内的事件的一个问题。
事件是在基类中的属性setter中触发的(当我更改属性值时),并且我在派生类(在锁内)中调用此属性。
代码看起来是这样的:问题的事件和死锁
class BaseClass
{
public event EventHandler StatusChanged;
int _status = 0;
object lockA = new object();
public int Status
{
get
{
lock (lockA) { return _status; }
}
set
{
bool fireEvent = false;
lock (lockA)
{
if (_status != value)
{
_status = value;
fireEvent = true;
}
}
if (fireEvent)
StatusChanged(this, EventArgs.Empty);
}
}
}
class DerivedClass : BaseClass
{
object lockB = new object();
public void SetStatus(int newStatus)
{
lock (lockB)
{
this.Status = newStatus;
}
}
}
的BaseClass的特性提高了锁外活动,以保护自己免受死锁,但派生类中设置自己的锁内的新状态。 由于派生类的开发人员可能不知道基类是如何工作的,确保死锁不会发生的最好方法是什么?也许在异步线程中引发事件?
你为什么要锁定派生类中的属性集? – 2011-04-28 07:44:43
我需要锁定更新代码以确保“检查和更新”操作是原子操作,否则两个不同的线程可能会同时更改属性。如果一个线程调用getter而第二个线程调用setter来更改状态,则同样的问题会发生,getter可能不会返回正确的值。 – Francesco 2011-04-28 07:49:42