事件和死锁的问题

本文关键字:问题 死锁 事件 | 更新日期: 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可能是一个属性,表示类是线程安全的,但实际上并没有。很抱歉