在以下情况下我应该锁定事件:
事件 foo;
线程 A:将调用 foo += handler;
线程 B:将调用 foo -= handler;
我应该锁定 foo 吗?
锁定foo
这是一个坏主意,因为该值每次都会改变。你应该锁定一个变量doesn't change:
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;
那么您将在添加/删除时自动获得“锁(this)”,尽管您必须在调用处理程序之前手动添加它(假设您想确保读取最近写入的值)。就我个人而言,我不喜欢锁定“this”,但您可能不介意 - 这肯定会使代码更简单。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)