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