2011-10-11 29 views
6

में बाहरी चर इस कोड को लेते हैं। लक्ष्य एक पेज है कि पहले से ही लाने के लिए निर्धारित है प्राप्त करने में कठिनाई से बचने के लिए स्पष्ट रूप से है। भराव वस्तु एक घटना एक लैम्ब्डा अभिव्यक्ति के माध्यम से सदस्यता लिया है कि उजागर करता है। मेरा प्रश्न है: हम कह सकते हैं कि पैरामीटर npage सही ढंग से multithread परिदृश्य में नियंत्रित किया जाता है? बेहतर: प्रत्येक घटना सदस्यता का अपना npage पैरामीटर प्राप्त करते हैं, या पिछले npage देखा सभी घटनाओं के लिए प्रचार है?लैम्ब्डा अभिव्यक्ति, multithread

उत्तर

7

चर कब्जा घोषणा गुंजाइश npage की प्रति होता है। पैरामीटर npage विधि स्तर पर घोषित किया जाता है, और कहा कि विधि के भीतर परिवर्तन नहीं करता है - तो वास्तव में, npage के उपयोग पूरी तरह धागा सुरक्षित है।

समस्या आप घटित होता परहेज कर रहे हैं यदि आप एक चर बदलते रहे थे इसकी घोषित दायरे के भीतर, आम तौर पर एक पाश - यानी

for(int npage = 0; npage < 100 ; npage++) 
    Foo((s,e) => DoSomething(npage)); // not safe; npage shared between all 

तथापि, एक विधि में तोड़ कर आप इस

बचने के लिए, यानी
for(int i = 0; i < 100; i++) 
    Hit(i); 
... 
void Hit(int npage) { 
    Foo((s,e) => DoSomething(npage)); // safe; npage is per-call 
} 
2

प्रत्येक Hit विधि का आह्वान npage संदर्भ के लिए अलग-अलग मान होगा।

दूसरे शब्दों में, इस विधि का आह्वान करने वाले प्रत्येक धागे का अपना npage होगा।

, क्योंकि इस प्रक्रिया लागू हर थ्रेड के लिए है यही कारण है, अपने परिचालन और ईवेंट हैंडलर सदस्यता अलग-अलग दायरों में जगह ले जाएगा, ताकि, npage संदर्भ गुंजाइश के मूल्य को इंगित करेंगे।

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