我必须使用匿名方法组织线程安全地从集合中删除项目。这样的事情。
...
lock(this.set)
{
...
this.set.Add(item);
action(()=>{
lock(this.set)
{
this.set.Remove(item);
}
});
}
...
匿名方法可能会从另一个线程执行。锁定操作符的这种方式是否正确?在这里我是否需要考虑一些即兴演奏?
提前致谢。
答案 0 :(得分:4)
但是,这会工作,你看过.NET 4中的ConcurrentCollections吗?它们是内部线程安全的
答案 1 :(得分:0)
这取决于action
对委托的作用(形成为lambda表达式)。如果它同步执行它,那么第二个lock
是没有意义的。但是,由于lock
可以重新输入,因此是安全的。如果它在另一个线程上异步执行,那么如果action
等待委托的任何调用完成,那么<em>可以死锁两个线程。那将是我能想到的唯一“即兴”。