c# - 锁的范围是什么?

标签 c# locking

我看过这段代码from one of the jetbrain's team :

查看这段代码:

object myLock = new object()

public IEnumerable<int> Values()
{
 lock (myLock)
 {
   for (var i=0;i<10;i++)
     yield return i;
 }
}



public void Test()
{
 foreach (var value  in Values())
  {
    DoHugeJob(value);   
  }
}


void Main()
{
    Test();
}

问题:

lock 的范围是什么?

最佳答案

如果您指的是时间 - 首次调用 MoveNext() 时将获取锁,并在 MoveNext() 时释放 either 已被第 11 次调用(即循环完成时)迭代器被释放时。

例如:

var iterable = Values();
// Lock is *not* acquired yet...

foreach (var item in iterable.Take(5)) {
    // Lock has been acquired
}
// Lock has been released even though we didn't get to the
// end of the loop, because foreach calls Dispose

通常正因为如此,在迭代器 block 中锁定是个坏主意 - 您确实希望在程序的一段短的、易于理解的时间内锁定。

关于c# - 锁的范围是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28040643/

相关文章:

hibernate - Grails中的悲观锁定3+ lock()

mysql - PHP+MySQL的仓库管理系统

c# - 在 MVC 4 模型中提交表单在 Controller 发布方法中为空

c# - 授予网络服务回收 iis 应用程序池的权限

postgresql - 更新子行锁定 PostgreSQL 中的父行(外键,9.1)

python - 多次实例化时 asyncio Lock 中的事件循环错误

java - 多个 Java 线程看似锁定同一个监视器?

c# - 如何关闭事件的datareader c#

c# - 如果启用优化,JIT 是否会始终内联此方法?

c# - LINQ - 将字符串转换为日期时间