C# 我应该锁定';事件';?

C# 我应该锁定';事件';?,c#,events,locking,C#,Events,Locking,在以下情况下,是否应锁定事件: 活动foo 线程A:将调用foo+=handler 线程B:将调用foo-=handler 我应该锁定foo吗?锁定foo是个坏主意,因为值每次都会改变。您应该锁定一个不变的变量: 请注意,如果使用类似于事件的字段,如下所示: public event EventHandler Foo; 然后,您将在添加/删除时自动获得一个“lock(this)”,尽管在调用处理程序之前获取处理程序时必须手动添加它(假设您希望确保读取最近写入的值)。就我个人而言,我不喜欢锁定“

在以下情况下,是否应锁定事件:

活动foo

线程A:将调用foo+=handler

线程B:将调用foo-=handler


我应该锁定foo吗?

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

请注意,如果使用类似于事件的字段,如下所示:

public event EventHandler Foo;

然后,您将在添加/删除时自动获得一个“lock(this)”,尽管在调用处理程序之前获取处理程序时必须手动添加它(假设您希望确保读取最近写入的值)。就我个人而言,我不喜欢锁定“this”,但你可能不介意——这当然会让代码更简单。

@Jon,我是直接使用事件调用事件处理程序,就像这个foo(),不是从事件中提取处理程序,我应该添加锁吗?@Benny:如果你使用类似事件的字段,你就没有要锁定的add/remove。如果直接调用事件处理程序,如何防止它为null?请注意,如果(foo!=null){foo(…);},则不能仅使用
,因为
foo
可能在测试后变为null。而且它也不能保证您会得到最新的值——这就是为什么我在我的
OnFoo
方法中得到了锁定。(内存模型可以做一些有趣的事情…)请注意,类似字段事件的codegen将在C#4中更改,以解决“锁定此”代码的气味。克里斯·布伦斯将在未来几个月的某个时候写一篇关于这一点的博客;查看他的博客了解详细信息。Jon的回答很好,但在回答之前,我会回过头来问你为什么你首先要做锁。你认为你有什么问题,为什么你认为锁定可以解决它?我可以想到多线程事件可能带来的多个问题;根据您担心的问题,您将使用不同的锁定技术。
public event EventHandler Foo;