2015-01-20 6 views
5

मैं कोड from one of the jetbrain's team के इस टुकड़े को देखा हैलॉक का दायरा क्या है?</p> <p>इस कोड को देखते हुए:

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

क्या आप लॉक या माय लॉक के बारे में पूछ रहे हैं? – bit

+0

@bit लॉक ...... 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 

सामान्य तौर पर यह एक बुरा विचार ठीक है क्योंकि इस की iterator ब्लॉक में लॉक करने के लिए है - क्या तुम सच में एक छोटी, अपने कार्यक्रम के आसानी से समझ में आ अवधि के लिए लॉक करना चाहते हैं।

संबंधित मुद्दे