在lock语句中使用匿名方法

时间:2011-07-20 08:06:10

标签: c# multithreading locking thread-safety

我必须使用匿名方法组织线程安全地从集合中删除项目。这样的事情。

...
lock(this.set)
{
   ...
   this.set.Add(item);

   action(()=>{
      lock(this.set)
      {
         this.set.Remove(item);
      }
   });
}
...

匿名方法可能会从另一个线程执行。锁定操作符的这种方式是否正确?在这里我是否需要考虑一些即兴演奏?

提前致谢。

2 个答案:

答案 0 :(得分:4)

但是,这会工作,你看过.NET 4中的ConcurrentCollections吗?它们是内部线程安全的

答案 1 :(得分:0)

这取决于action对委托的作用(形成为lambda表达式)。如果它同步执行它,那么第二个lock是没有意义的。但是,由于lock可以重新输入,因此是安全的。如果它在另一个线程上异步执行,那么如果action等待委托的任何调用完成,那么<​​em>可以死锁两个线程。那将是我能想到的唯一“即兴”。