我看过这段代码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/