我明白了:
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 {}中删除锁定,或将新值传递给处理程序, 但这一切看起来都不对。
答案 0 :(得分:1)
锁定后调度事件,否则永远不能保证事件处理代码(不受控制)不会尝试读取属性并导致死锁,即使您锁定了私有对象。 / p>