2010-05-31 23 views
5

को कार्यान्वित करने के लिए कैसे मैं सिस्टम में नए थ्रेडिंग संरचनाओं का उपयोग कर एक रद्द करने योग्य कार्यकर्ता थ्रेड को लागू करने का प्रयास कर रहा हूं। थ्रेडिंग टास्क नामस्थान। अब तक मैं इस कार्यान्वयन के साथ आए हैं:रद्द करने योग्य कार्यकर्ता थ्रेड

public sealed class Scheduler 
{ 
    private CancellationTokenSource _cancellationTokenSource; 
    public System.Threading.Tasks.Task Worker { get; private set; } 

    public void Start() 
    { 
     _cancellationTokenSource = new CancellationTokenSource(); 

     Worker = System.Threading.Tasks.Task.Factory.StartNew(
      () => RunTasks(_cancellationTokenSource.Token), 
      _cancellationTokenSource.Token 
     ); 
    } 

    private static void RunTasks(CancellationToken cancellationToken) 
    { 
     while (!cancellationToken.IsCancellationRequested) 
     { 
      Thread.Sleep(1000); // simulate work 
     } 
    } 

    public void Stop() 
    { 
     try 
     { 
      _cancellationTokenSource.Cancel(); 
      Worker.Wait(_cancellationTokenSource.Token); 
     } 
     catch (OperationCanceledException) 
     { 
      // OperationCanceledException is expected when a Task is cancelled. 
     } 
    } 
} 

Stop() रिटर्न मैं उम्मीद जब Worker.StatusTaskStatus.Canceled किया जाना है।
मेरे यूनिट परीक्षणों से पता चला है कि कुछ शर्तों के तहत Worker.StatusTaskStatus.Running पर सेट है।

क्या यह एक रद्द करने योग्य कार्यकर्ता थ्रेड को लागू करने का एक सही तरीका है?

उत्तर

5

मुझे विश्वास है कि समस्या

Worker.Wait(_cancellationTokenSource.Token); 

टोकन के लिए इंतजार कर रहा है यही कारण है कि संकेत किए जाने के लिए अपने कॉल में शामिल है - है, जो यह पहले से ही है, क्योंकि आप सिर्फ Cancel() कहा जाता है। आप बदल कि सिर्फ

Worker.Wait(); 

तो मेरा मानना ​​है कि यदि आप RanToCompletion के एक राज्य देखेंगे। आपको रद्द नहीं किया जाएगा, क्योंकि आपका कार्य OperationCanceledException फेंक नहीं रहा है। आप अंत में

cancellationToken.ThrowIfCancellationRequested() 

कॉल करने के लिए अपने RunTasks विधि बदलते हैं, तो आप एक AggregateExceptionStop में पकड़ने के लिए की आवश्यकता होगी - लेकिन फिर तुम अंत में Canceled के एक राज्य देखेंगे।

कम से कम, मेरा प्रयोग दिखाता है :)

+0

हां, इस मुद्दे को ठीक किया गया। धन्यवाद। –

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