回答
锁定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;
那么你会自动获得一个“在添加/删除时锁定(this)“,尽管您在调用处理程序之前必须手动添加它(假设您要确保读取最近写入的值)。就我个人而言,我不是锁定“this”的粉丝,但你可能不介意 - 它确实使代码更简单。
@Jon,我正在使用类似场景的事件,所以我不需要锁定添加/删除,我是对吗? – Benny 2010-02-05 08:17:54
@Jon,我直接调用了事件处理函数,像这样foo(),不会从事件中获取处理函数,我应该添加锁吗? – Benny 2010-02-05 08:24:42
@Benny:如果你使用的是类似场景的事件,你不需要*添加/删除来锁定。如果你直接调用事件处理程序,你如何防止它为空?请注意,您不能只使用'if(foo!= null){foo(...); }'as'foo'可以在测试后变成* null。也不能保证你会得到最新的值 - 这就是为什么我在我的'OnFoo'方法中获得锁定的原因。 (内存模型可以做些有趣的事情......) – 2010-02-05 08:26:40
- 1. 我应该在dlopen之前锁定吗?
- 2. 我可以在Rails中锁定表吗? (我应该吗?)
- 3. 我应该使用事件吗?
- 4. 我应该使用唤醒锁吗?
- 5. 我应该在C#中读取文件之前锁定文件吗?
- 6. Git(LFS):什么是锁定支持?我应该启用它吗?
- 7. android复制保护向前锁定 - 我应该不打扰吗?
- 8. 我应该使用MySQL的自定义'锁'表吗?
- 9. iOS锁定事件?
- 10. 我应该尝试将asp控件事件放入BLL中吗?
- 11. 响应设备锁定时的事件
- 12. EventHandler应该总是用于事件吗?
- 13. clSetEventCallback,应该明确保留事件吗?
- 14. NSLock - 锁定锁定锁时应该阻止?
- 15. 这应该称为互斥锁吗?
- 16. 我应该公开行动而不是事件吗?
- 17. 确定对象何时准备就绪。我应该使用事件吗?
- 18. C#从事件中锁定
- 19. 我应该定期重置QUERY CACHE吗?
- 20. 我应该在MainActivity中定义SharedPreferences吗?
- 21. 我应该在分布式锁中封装redis incr吗?
- 22. 我应该使用ManualResetEvent作为锁对象吗?
- 23. 读取值时应该锁定资源吗?
- 24. 在读取/ etc/passwd时,我的程序应该锁定/etc/.pwd.lock吗?
- 25. 我应该使用什么asp.net事件?
- 26. 我应该如何处理Button事件?
- 27. 我应该购买Obout控件吗?
- 28. 我应该检查* .mo文件吗?
- 29. 我应该提交solr文件吗?
- 30. 我应该忽略xcodeproject/project.pbxproj文件吗?
乔恩的回答很好,但在回答之前,我会推回去问为什么你首先要做锁定。 *你相信你有什么问题,你为什么认为锁定解决了它?*我可以想到多线程事件可能存在的多个问题;你会根据你担心的问题使用不同的锁定技术。 – 2010-02-05 18:24:54