我应该锁定'事件'吗?

Ben*_*nny 13 c# events locking

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

事件foo;

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

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

我应该锁定foo吗?

Jon*_*eet 24

锁定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);
    }
}
Run Code Online (Sandbox Code Playgroud)

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

public event EventHandler Foo;
Run Code Online (Sandbox Code Playgroud)

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

  • @Benny:如果您使用的是类似字段的事件,则您不会*拥有*添加/删除来锁定。如果您直接调用事件处理程序,您如何防止它为空?请注意,您不能只使用 `if (foo != null) { foo(...); }` 因为`foo` 可能在测试后*变成* null。它也不能保证你会得到最新的值——这就是我在我的“OnFoo”方法中锁定的原因。(记忆模型可以做有趣的事情......) (2认同)