我应该锁定’事件’吗?

我应该在以下情况下锁定事件:

事件foo;

线程A:将调用foo + = handler;

线程B:将调用foo – = handler;

我应该锁定foo吗?

锁定foo是一个坏主意,因为每次都会改变值。 你应该锁定一个不会改变的变量:

 private readonly object eventLock = new object(); private EventHandler fooHandler; public event EventHandler Foo { add { lock (eventLock) { fooHandler += value; } } remove { lock (eventLock) { fooHandler -= value; } } } private void OnFoo(EventArgs e) { EventHandler handler; lock (eventLock) { handler = fooHandler; } if (handler != null) { handler(this, e); } } 

请注意,如果您使用类似字段的事件,请执行以下操作:

 public event EventHandler Foo; 

然后你会在添加/删除时自动获得“锁定(这个)”,尽管在调用它之前你必须手动添加它(假设你想确保你读取最近写的值)。 就个人而言,我不是一个锁定“这个”的粉丝,但你可能不介意 – 它肯定会使代码更简单。