2009-09-11 3 views
6

में प्रतिनिधियों के माध्यम से विधियों को रद्द कर सकता हूं यदि मैं "प्रसंस्करण" एनीमेशन स्क्रीन में रद्द करने के लिए तुरंत एक विधि को रोकना चाहता हूं। मैं प्रतिनिधियों के माध्यम से Async कॉल का उपयोग कर रहा हूँ। क्या प्रतिनिधियों के माध्यम से विधि के निष्पादन को तुरंत रोकना संभव है?क्या मैं सी #

धन्यवाद :)

उत्तर

9

नहीं - कम से कम, साफ-सफाई नहीं। (मैं Thread.Abort को "साफ" के रूप में शामिल नहीं करता हूं।) आपको क्या करना चाहिए प्रतिनिधि को यह बताने के लिए एक तंत्र है कि आप को रद्द करने के लिए प्रयास कर रहे हैं। तब आपके प्रतिनिधि को कभी-कभी रद्दीकरण ध्वज की जांच करने और तदनुसार प्रतिक्रिया करने की आवश्यकता होगी।

समांतर एक्सटेंशन में पूरे स्थान पर रद्दीकरण किया गया है (और विशेष रूप से रद्दीकरण टोकन को कार्य को रद्द करने के लिए कोड के उचित टुकड़े की अनुमति देने के लिए)। जहां तक ​​मुझे पता है, यह अभी भी सहकारी है। जबरन रद्दीकरण हमेशा राज्य को भ्रष्ट करने का जोखिम चलाएगा।

1

जैसा कि जॉन ने पहले ही कहा है, आप धागे को नहीं बता सकते हैं: "कृपया अभी रोकें" और थ्रेड को मानने की उम्मीद है। थ्रेड। एबॉर्ट इसे रोकने के लिए नहीं कहेंगे, बस इसे "अनप्लग" करेगा। :)

मैंने पहले क्या किया था थ्रेड के कोड में "if (wehavetostop)" की एक श्रृंखला जोड़ दी गई थी और यदि उपयोगकर्ता ने "रद्द" दबाया तो मैंने wehavetostop == सच रखा।

यह बहुत ही सुरुचिपूर्ण नहीं है और कुछ मामलों में यह "अगर" चेक डालने के लिए "कठिन" हो सकता है, विशेष रूप से यदि आपका धागा एक "लंबा" ऑपरेशन चलाता है जिसे आप विभाजित नहीं कर सकते हैं।

यदि आप नेटवर्क कनेक्शन स्थापित करने की कोशिश कर रहे हैं (और इसमें समय लगता है) और आप वास्तव में सोचते हैं कि धागे की "असामान्य" समाप्ति किसी भी भ्रष्ट स्थिति का कारण नहीं बनती है, तो आप इसका उपयोग कर सकते हैं, लेकिन याद रखें कि आप नहीं कर सकते उस धागे में शामिल चीजों की स्थिति पर भरोसा करें।

5

आप System.ComponentModel.BackgroundWorker का उपयोग कर सकते हैं। यह रद्दीकरण का समर्थन करता है ताकि आपको बॉयलरप्लेट कोड लिखने की आवश्यकता न हो। ग्राहक कोड बस CancelAsyn विधि को कॉल कर सकता है और आप अपने कोड के भीतर CancellationPending संपत्ति देख सकते हैं, जब यह निर्धारित करने के लिए समझदारी हो जाती है कि ग्राहक ने ऑपरेशन रद्द कर दिया है या जमानत दे दी है या नहीं।