2015-01-20 3 views
5

Я видел этот кусок кода 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?

+0

Вы спрашиваете о замке или myLock? – bit

+0

@bit lock ...... mylock - это поле –

ответ

6

Если вы имеете в виду с точки зрения времени - блокировка будет приобретенной при MoveNext() сначала вызывается, и будет выпущен либо когда MoveNext() был назван 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 

В целом это плохая идея, чтобы зафиксировать блоки итераторов именно из-за этого - вы действительно хотите заблокировать для короткого, легко понимаемого периода вашей программы.