事件和死锁问题

时间:2011-04-28 07:39:21

标签: c#


我在锁中提升事件时遇到问题 该事件在基类中的属性设置器中触发(当我更改属性值时),并且我在派生类(锁内)中调用此属性。
代码看起来像这样:

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属性引发锁外的事件以保护自己免受死锁,但派生类将新状态设置在自己的锁中。 由于派生类的开发人员可能不知道基类是如何工作的,因此确保不会发生死锁的最佳方法是什么?也许在异步线程中引发事件?

3 个答案:

答案 0 :(得分:1)

锁定在同一个线程中不会“锁定”,因此我认为您的代码不存在死锁风险。

答案 1 :(得分:0)

嗯,我想我必须同意那里确实没有死锁风险。但是,您如何看待使用BeginInvoke()来启动用户代码?

BeginInvoke(this, EventArgs.Empty, null, null);

答案 2 :(得分:0)

当你创建BaseClass时只是将它注释为ThreadSafe,那么如果任何开发人员实现这个基类并且没有看到它的注释表明它已经是线程安全的话那么这就是他们自己的问题。

我认为他们可能是一个属性,表明类是线程安全但没有一个。遗憾。