【发布时间】:2013-03-28 23:53:53
【问题描述】:
我在锁内引发事件时遇到问题。
该事件在基类的属性设置器内触发(当我更改属性值时),我在派生类中调用此属性(在锁内)。
代码如下所示:
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 属性在锁外引发事件以保护自己免受死锁,但派生类在自己的锁内设置新状态。 由于派生类的开发人员可能不知道基类是如何工作的,那么确保不会发生死锁的最佳方法是什么?也许在异步线程中引发事件?
【问题讨论】:
-
为什么要锁定派生类中设置的属性?
-
我需要锁定更新代码以确保“检查和更新”操作是原子的,否则两个不同的线程可能同时更改属性。如果一个线程调用 getter 而另一个线程调用 setter 来更改状态,也会发生同样的问题,getter 可能不会返回正确的值。
标签: c#