2012-04-16 11 views
15

परिदृश्य: एक पाश में एक अतुल्यकालिक काम के लिए एक विधि तर्क है कि कार्यक्रम के रूप में परिवर्तित युक्त जारी है कार्यान्वित: पाश तेजी से कार्य पूरा से चलाता हैकार्य बदलने के मूल्यों के साथ तर्क पास करना - व्यवहार?

while(this._variable < 100) 
{ 
    this._variable++; 
    var aTask = Task.Factory.StartNew(() => 
    { 
     aList.add(this._variable); 
     update(this._savePoint); 
    }); 
} 

तो सूची चर के वर्तमान मूल्य जोड़ना होगा या परिवर्तनीय स्थानीय रूप से सहेजा गया है और मूल मूल्य जोड़ा गया है?

+3

जॉन स्कीट द्वारा इसे देखें: http://csharpindepth.com/Articles/Chapter5/Closures.aspx –

+0

+1 उत्कृष्ट प्रश्न! – nawfal

उत्तर

11

वैरिएबल पर बंद क्लोजर, मान नहीं। इसलिए, _variableबढ़ाना उस कार्य के व्यवहार को बदल सकता है जो इसे संदर्भित करता है।

आप एक स्थानीय प्रतिलिपि बनाकर इसे रोकने के कर सकते हैं:

while (this._variable < 100) 
{ 
    this._variable++; 
    int local = _variable; 
    var aTask = Task.Factory.StartNew(() => 
    { 
     aList.add(local); 
     update(this._savePoint); 
    }); 
} 

या आप राज्य के रूप में कार्य करने के लिए मूल्य दे सकते हैं:

while (this._variable < 100) 
{ 
    this._variable++; 
    var aTask = Task.Factory.StartNew(object state => 
    { 
     aList.add((int)state); 
     update(this._savePoint); 
    }, this._variable); 
} 

इन दोनों को _variable का मूल्य को कॉपी करके काम एक नया अस्थायी चर। पहले मामले में local वैरिएबल को लूप के दायरे में परिभाषित किया गया है, इसलिए आपको प्रत्येक पुनरावृत्ति के लिए एक नया मिलता है। दूसरे मामले में, जब आप कार्य को state तर्क के रूप में पास करते हैं तो आप _variable के मान की एक प्रति बनाते हैं। यदि _variable एक संदर्भ प्रकार थे, तो ये समाधान काम नहीं करेंगे; आपको एक क्लोन करना होगा।

+0

क्या होगा यदि चर एक वर्ग का उदाहरण है? लूप के भीतर 'SomeClass localVariable = this._variable'। एक संदर्भ होने के नाते, आप कैसे सुनिश्चित करेंगे कि आपको एक बदली हुई स्थिति नहीं मिलती है। – asunrey

+1

@Moyler: आपको लूप के अंदर इंस्टेंस क्लोन करना होगा, जिसका अर्थ है कि आप एक नया उदाहरण बनाते हैं और मूल गुणों के समान गुणों के मान बनाते हैं। –

+0

धन्यवाद, मुझे इसकी पुष्टि की आवश्यकता है। इसके अलावा, मैं मूल रूप से एक संदर्भ प्रकार के लिए मेरे उदाहरण के लिए मतलब था। यद्यपि एक सौदे के लिए दो पाने के लिए बहुत अच्छा है। – asunrey

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