2011-03-14 12 views
8

मान लें, वहाँ लगभग निम्न क्रियाओं से युक्त एक काम है:मैं कार्य रद्दीकरण को कैसे बल दूं?

Task someTask = new Task(() => { 

    while(!IsCancellationRequested) { 

    Do_something_over_a_long_period_of_time(); 
    token.ThrowIfCancellationRequested(); 

    Do_something_over_a_long_period_of_time(); 
    token.ThrowIfCancellationRequested(); 

    Do_something_over_a_long_period_of_time(); 
    token.ThrowIfCancellationRequested(); 
    } 
}); 
someTask.Start(); 

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

मैं Thread कक्षा का उपयोग करता था और Abort() कमांड का आह्वान करने के तुरंत बाद अपने सभी धागे को निरस्त करने में सक्षम था।

मैं अपने कार्यों को तुरंत कैसे रोकूं?

धन्यवाद।

+1

क्या आपने पृष्ठभूमिवर्कर को देखा है? – HadleyHope

+0

@ हैडलीहोप पृष्ठभूमि कार्यकर्ता अपनी समस्या का समाधान कैसे करेगा। यह कार्य – Kugel

उत्तर

2

वे तुरंत मेरे आवेदन को समाप्त करना चाहते हैं। लंबी प्रतीक्षा चल रही है, जबकि वे इंतजार नहीं करना चाहते हैं।

डिफ़ॉल्ट रूप से, कार्य पृष्ठभूमि कार्यों के रूप में थ्रेडपूल पर चलते हैं। आप पृष्ठभूमि धागे के बारे में परेशान किए बिना एप्लिकेशन से सुरक्षित रूप से बाहर निकल सकते हैं।

इसलिए जब तक आप अपनी प्रक्रिया को छोड़ना चाहते हैं, वहां कोई समस्या नहीं है।

ध्यान दें कि थ्रेड.एबॉर्ट() त्वरित था लेकिन सुरक्षित नहीं था। एक छोड़ने के आवेदन के लिए भी नहीं, लेकिन फिर शायद ही कभी एक वास्तविक समस्या का कारण बनता है।

+6

मुझे नहीं लगता कि मैं कहूंगा कि" कोई समस्या नहीं है "- क्या होगा यदि उनमें से एक पृष्ठभूमि धागे लिखने के माध्यम से आधा रास्ता है अगली बार जब यह शुरू होता है तो फाइल को किसकी आवश्यकता होगी? –

+0

मैं थ्रेडपूल और पृष्ठभूमि कार्यों के बारे में भूल गया हूं। यह अभी ठीक काम करता है। धन्यवाद। –

+0

@ जोन आप सिद्धांत में सही हैं लेकिन ओपी थ्रेड.एबॉर्ट() का उपयोग करने के लिए प्रयोग किया जाता है ... –

18

आप एक कार्य को असंगत तरीके से निरस्त करने के लिए मजबूर नहीं कर सकते हैं। एक अनियंत्रित तरीके से धागे को छोड़ना असुरक्षित है, और इस प्रकार जानबूझकर असमर्थित है।

आपको अपने Do_something_over_a_long_period_of_time कॉल को इसके बजाय रद्द करने योग्य बनाना चाहिए (यानी उन्हें टोकन पास करें, और उन्हें नियमित रूप से भी जांचें)।

संपादित करें: जैसा कि एक और उत्तर में बताया गया है, आप यह सुनिश्चित करके एप्लिकेशन को मार सकते हैं कि सभी अग्रभूमि धागे समाप्त हो गए हैं। लेकिन आपको यह पता होना चाहिए कि आपके कार्यों को को साफ-सुथरा समाप्त करने का मौका नहीं होगा। अगर वे फाइलें लिखने जैसी चीजें कर रहे हैं, तो आप निरंतर स्थिति को दूषित करने से बचने के लिए रद्दीकरण को ध्यान में रखकर इंतजार करना चाहेंगे।

+0

जैसे ही रद्द करने का समर्थन करता है धन्यवाद। यह मेरे लिए बहुत उपयोगी है। –

+0

तो अगर मैं एक नया कार्य स्पिन करता हूं जो सिर्फ एक विधि को GetDataThatRunsForTheNext40secs() कहते हैं, तो तुरंत बाहर से कार्य को रद्द करने का कोई तरीका नहीं है? इस तरह के रद्द करने के नतीजे कोई फर्क नहीं पड़ता - लेकिन मैं चाहता हूं कि मेरा सीपीयू जल्द से जल्द उपयोगी चीजें कर रहा हो। विचार? – Gishu

+0

@ गिशू: मुझे किसी भी तरह से पता नहीं है जो सवाल * कार्य के सहयोग के बिना * सुरक्षित रूप से * कर सकता है। –

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

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