2011-03-02 18 views
10

मेरे पास एक ऐसा कार्य है जिसे प्रतीक्षा समय समाप्त होने पर मुझे रद्द करने की आवश्यकता है। उदाहरण के लिएकोई कार्य रद्द करना

var t = Task.Factory.StartNew(() => 
{ 
    Thread.Sleep(5000) // some long running task 
    "do something" 
}); 
Task.WaitAll(new[] {t}, 1000); 

लेकिन ऐसा लगता है कि कार्य अभी भी काम करता रहता है। मैंने CancellationTokenSource का उपयोग करने का प्रयास किया लेकिन यह भी काम नहीं कर रहा था।

मैं इस निम्नलिखित स्निपेट

static void Main(string[] args) 
     { 
      var cancellationTokenSource = new CancellationTokenSource(); 

      var t = Task.Factory.StartNew(() => { 
       Thread.Sleep(5000); 
       Console.WriteLine("Still working"); 
      }, cancellationTokenSource.Token); 

      Task.WaitAll(new[] {t}, 1000); 

      cancellationTokenSource.Cancel(); 

      Console.ReadLine(); 
     } 

कंसोल प्रदर्शित करता है "अभी भी काम कर" का उपयोग कर पुष्टि की। मैंने सोचा कि कार्य रद्द कर दिया गया होगा।

मुझे यकीन है कि मुझे कुछ याद आ रहा है। मैं क्या खो रहा हूँ? धन्यवाद।

उत्तर

29

रद्दीकरण टोकन जादुई रूप से कुछ भी रद्द नहीं करते हैं। वे को मानकीकृत तरीके से रद्दीकरण की जांच करने के लिए अनुमति देते हैं, उदा। ThrowIfCancellationRequested के माध्यम से।

तो आम तौर पर आपके पास कुछ कार्य होता है जिसके लिए बहुत सारे काम करने की आवश्यकता होती है। यह समय-समय पर ThrowIfCancellationRequested पर कॉल करता है, और उसके बाद किसी भी कोड को कार्य को रद्द करने की आवश्यकता होती है, Cancel को CancellationTokenSource पर कॉल करने की आवश्यकता होती है। जब यह रद्दीकरण के लिए अगली जांच करता है तो कार्य फेंक देगा, और सब ठीक रहेगा।

ऐसा लगता है कि आप एक गैर-सहकारी रद्दीकरण की तलाश में हैं - और यह खतरनाक होगा, सामान्य कारणों से सामान्य Thread.Abort खतरनाक है। कार्य को उन बिंदुओं को चुनने के लिए क्लीनर है जिस पर यह स्वयं को रद्द करने की अनुमति देगा।