2008-10-27 10 views
8

मेरे पास एक लूप चल रहा है जो 1000 के रिकॉर्ड को संसाधित करेगा, वर्तमान में लूप चलने के बाद इसे रोक नहीं दिया जा सकता है और उपयोगकर्ता को समाप्त होने तक प्रतीक्षा करनी चाहिए। जब कोई 'रद्द करें' बटन पर क्लिक करता है तो मैं लूप को कैसे रोक सकता हूं? मैं उस अन्य दिनचर्या में कैसे टूट सकता हूं?सी # मैं एक और उप दिनचर्या में एक ब्रेक कैसे भेज सकता हूं?

धन्यवाद

उत्तर

13

आप इसे अपने थ्रेड में चला सकते हैं और धागे को रोक सकते हैं। बस सावधान रहें कि ऑपरेशन को खराब स्थिति में छोड़ दें।

इसके बजाय, आप एक निकास ध्वज बना सकते हैं जो थ्रेड सुरक्षित स्थानों पर चेक करता है। यदि इसे बाहर निकलने के लिए चिह्नित किया गया है, तो थ्रेड जल्द ही बंद हो जाएगा क्योंकि यह ऐसा करने के लिए सुरक्षित है।

+0

मैं इस विचार प्यार करता हूँ, एक निकास ध्वज के विचार अपील है: MSDN लेख कि जुड़ा हुआ chakrit नमूना कोड का एक अच्छा ब्लॉक

संपादन , हालांकि उपयोगकर्ता शिकायत कर सकते हैं कि इसमें पहुंचने में कोई देरी हो रही है, उम्मीद है कि यह एक बड़ी प्रक्रिया नहीं होगी;) – thismat

+0

को रद्द करें संदेश प्राप्त करने के लिए उन्हें जीत कतार भी, DoEvents शैली की जांच करने की आवश्यकता होगी। –

+0

यह 99% समय लेगा जो एक रिकॉर्ड को संसाधित करने में लग रहा है, है ना? यदि इसमें काफी समय लग रहा है तो आपको अन्य समस्याएं हो सकती हैं। –

0

जैसा कि मार्क ने कहा था कि आपको किसी प्रकार के सहकारी सिंक्रनाइज़ेशन को लागू करने की आवश्यकता है। लोग अक्सर थ्रेड का उपयोग करना चाहते हैं। यहां आओ ... लेकिन यह एक बुरा विचार है।

वहाँ उदाहरण के लिए देखें, सवाल है कि इसका समाधान करने के एक नंबर रहे हैं: "Is there a good method in C# for throwing an exception on a given thread."

13

तुम बस BackgroundWorker घटक का उपयोग कर सकते हैं।

यह घटना-आधारित है और इसका उपयोग करना बहुत आसान है। आप जो वर्णन कर रहे हैं उसके लिए बहुत उपयुक्त लगता है।

यह रद्द संकेत के साथ ही प्रगति भी रिपोर्ट करने के लिए अच्छा समर्थन हासिल है।

और Google पर कई कोड उदाहरण देख सकते हैं।


WorkerSupportsCancellation संपत्ति सेट करें तो यह सच है।

backgroundworker1.WorkerSupportsCancellation = true; 

यह करो इससे पहले कि आप कार्यकर्ता शुरू करते हैं।

फिर, पाश में, आप CancellationPending संपत्ति मतदान कर सकते हैं:

if (backgroundWorker1.CancellationPending) return; 

बस एक उदाहरण है, लेकिन आप विचार प्राप्त करना चाहिए।

+0

जैसा कि अलग उत्तरों में वर्णित है, आपको RunWorkerAsynch() को कॉल करने से पहले वर्कर सपोर्ट्स कैनसेलेशन प्रॉपर्टी को सत्य पर सेट करना होगा। लूपिंग के दौरान आपके कार्यकर्ता कोड को अभी भी ध्वज की जांच करनी है। –

+0

मैंने पहले से ही संपादित किया है .. धन्यवाद! – chakrit

0

आप एक बटन को रद्द जो लूप के अंदर एक बूलियन ध्वज

सेट मुख्य बिंदुओं पर "Application.DoEvents" जोड़ने और फिर बूलियन ध्वज जाँच जोड़ सकते हैं। अगर ध्वज फिसल गया है, तो अपने सफाई को पूर्ववत करें और लूप से बाहर निकलें।

1

उत्तर के लिए धन्यवाद। यह एक backgroundworker है लेकिन जब मैं backgroundworker1.cancelAsync(); का उपयोग मैं अपवाद:

"यह BackgroundWorker कहा गया है कि यह रद्द करने का समर्थन नहीं करता संशोधित WorkerSupportsCancellation राज्य के लिए है कि यह समर्थन रद्द करता है।"

मैं इसे बदलने के बारे में कैसे जा सकता हूं? यह विरासत कोड है, क्षमा करें!

+0

backgroundwork1.WorkerSupportsCancellation = true;/* पृष्ठभूमि कार्यकर्ता 1 उदाहरण बनाने के बाद यह सही करें * / – granadaCoder

0

सच करने के लिए अपने BackgroundWorker पर WorkerSupportsCancellation प्रॉपर्टी सेट :-)

तुम भी CancellationPending संपत्ति अपने पाश अंदर जांच करने के लिए आप प्रसंस्करण निरस्त किया जाना चाहिए यह देखने के लिए मिल गया है। डी 'ओह, आप मुझे कुछ सेकंड से मिला वहाँ chakrit :)

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

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