事件和死锁的问题
本文关键字:问题 死锁 事件 | 更新日期: 2023-09-27 17:53:42
我在锁内引发事件时遇到问题
该事件在基类的属性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属性在锁外引发事件以保护自己免受死锁的影响,但派生类在自己的锁内设置新状态。既然派生类的开发人员可能不知道基类是如何工作的,那么确保死锁不会发生的最佳方法是什么?也许在异步线程中引发事件?
同一线程中的锁定不会"锁定",因此我认为您的代码不存在死锁风险。
好吧,我想我必须同意那里真的没有死锁的风险。但是,您认为使用BeginInvoke((来启动用户代码怎么样?
BeginInvoke(this, EventArgs.Empty, null, null);
当您创建基类时,只需将其注释为ThreadSafe,那么如果任何开发人员实现了这个基类,但没有看到它的注释表明它已经是线程安全的,那么这就是他们自己的问题。
我认为thier可能是一个属性,表示类是线程安全的,但实际上并没有。很抱歉