आइए बस कहें कि आपके पास एक साधारण ऑपरेशन है जो पृष्ठभूमि थ्रेड पर चलता है। आप इस ऑपरेशन को रद्द करने का एक तरीका प्रदान करना चाहते हैं ताकि आप एक बुलियन ध्वज बना सकें जिसे आपने रद्द बटन के क्लिक ईवेंट हैंडलर से सही पर सेट किया है।क्या मुझे सी # में एक साधारण बूलियन ध्वज तक पहुंचने पर अस्थिर के रूप में लॉक या चिह्नित करने की आवश्यकता है?
private bool _cancelled;
private void CancelButton_Click(Object sender ClickEventArgs e)
{
_cancelled = true;
}
अब आप GUI थ्रेड से रद्द ध्वज सेट कर रहे हैं, लेकिन आप इसे पृष्ठभूमि थ्रेड से पढ़ रहे हैं। क्या आपको बूल तक पहुंचने से पहले लॉक करने की ज़रूरत है?
आप ऐसा करने (और स्पष्ट रूप से बटन क्लिक ईवेंट हैंडलर में भी ताला) की जरूरत है चाहेंगे:
while(operationNotComplete)
{
// Do complex operation
lock(_lockObject)
{
if(_cancelled)
{
break;
}
}
}
या यह स्वीकार्य (कोई लॉक के साथ) यह करने के लिए है:
while(!_cancelled & operationNotComplete)
{
// Do complex operation
}
या _cancelled चर को अस्थिर के रूप में चिह्नित करने के बारे में क्या। क्या यह आवश्यक है?
[मुझे पता है कि इसके अंतर्निहित CancelAsync() विधि के साथ पृष्ठभूमिवर्कर वर्ग है, लेकिन मुझे अर्थशास्त्र में दिलचस्पी है और लॉकिंग और थ्रेडेड वैरिएबल एक्सेस का उपयोग यहां नहीं है, विशिष्ट कार्यान्वयन नहीं, कोड सिर्फ एक उदाहरण है। ]
दो सिद्धांतों के रूप में प्रतीत होता है।
1) क्योंकि यह एक साधारण इनबिल्ट प्रकार है (और इनबिल्ट प्रकारों तक पहुंच नेट पर परमाणु है) और क्योंकि हम केवल एक ही स्थान पर इसे लिख रहे हैं और केवल पृष्ठभूमि धागे पर पढ़ रहे हैं, वहां लॉक करने की आवश्यकता नहीं है या अस्थिर के रूप में चिह्नित करें।
2) आपको इसे अस्थिर के रूप में चिह्नित करना चाहिए क्योंकि यदि आप संकलक को लूप में पढ़ने को अनुकूलित नहीं कर सकते हैं क्योंकि यह मान को संशोधित करने में सक्षम कुछ भी नहीं सोचता है।
सही तकनीक कौन सा है? (और क्यों?)
[संपादित करें: इस पर विचार के दो स्पष्ट रूप से परिभाषित और विरोध करने वाले स्कूल प्रतीत होते हैं। मैं इस पर एक निश्चित उत्तर ढूंढ रहा हूं, इसलिए यदि संभव हो तो अपने कारणों को पोस्ट करें और अपने उत्तर के साथ अपने स्रोतों का हवाला दें।]
हां, आपको * या तो 'अस्थिर' या 'लॉक' (स्मृति बाधा के रूप में कार्य करने के लिए) की आवश्यकता है: http://stackoverflow.com/questions/458173/can-ac-thread-really-cache- एक-मूल्य-और-अनदेखा-परिवर्तन-से-मूल्य-पर-अन्य-वें/458193 # 458193 –
क्या इसका मतलब यह है कि साइमन को द्रव्यमान बहस में लाल चेहरे का सामना करना पड़ रहा है, जिसमें वह ईफ्राइम (http : //stackoverflow.com/questions/1221839/c-break-out-of-loop-on-button-press/1221854#1221854) – ThePower
@Marc: अच्छा उदाहरण, धन्यवाद। @ThePower: मुझे यकीन नहीं है कि मैं अपने हाथों को ऊपर रखकर खुश हूं, इसलिए उम्मीद है कि मैं केवल हल्के गुलाबी चेहरे से बच जाऊंगा = :) –