C#事件死锁

时间:2014-02-27 10:51:29

标签: c#

我明白了:

object locker = new object(); // EDIT: sorry, omitted for simplicity. lock(this) is not the source of the problem.
private Something property;
public event SomethingHandler PropertyChanged;

public Something Property
{
    get {
        lock (locker) {
            return property;
        }
    }

    set {
        lock (locker) {
            property = value;
            PropertyChanged();
        }
    }
}

然后这个:

MyClass.PropertyChanged += () =>
{
    DoSomethingWithNewValue(MyClass.Property);
};

由于显而易见的原因,这会导致死锁。 处理这种情况的正确方法是什么?

我可以在锁定{}后放置PropertyChanged() 或从get {}中删除锁定,或将新值传递给处理程序, 但这一切看起来都不对。

1 个答案:

答案 0 :(得分:1)

锁定后调度事件,否则永远不能保证事件处理代码(不受控制)不会尝试读取属性并导致死锁,即使您锁定了私有对象。 / p>