2012-01-11 5 views
11

मेरे पास एक साधारण सवाल है, मैंने लूप के लिए सरल समानांतर अनुसरण किया है। यह लूप के लिए विंडोज सेवा का हिस्सा है। मैं लूप को रोकना चाहता हूं, जब कोई सेवा बंद कर देता है। मैं समानांतर रोकने के तीन तरीकों को ढूंढ सकता हूं, जो स्थिति में है। लूप के समानांतर को रोकने का क्या सबसे अच्छा तरीका है और अंतर क्या हैं?लूपस्टेट के बीच क्या अंतर है। ब्रेक(), लूपस्टेट। स्टॉप() और रद्दीकरण टोकनसोर्स। कैंसल()

 CancellationTokenSource cancellationToken = new CancellationTokenSource(); 
     ParallelOptions options = new ParallelOptions(); 
     options.CancellationToken = cancellationToken.Token; 

     Parallel.For(0, maximum_operations, options, (a, loopState) => 
     { 
      { 
       //Do something 

       if(!KeepProcessing) 
       { 
        //loopState.Break(); 
        //loopState.Stop(); 
        cancellationToken.Cancel(); 

       } 
      } 
     }); 

उत्तर

15

CancellationTokenसंकेत रद्द किया जाता है।

loopState.Break() और loopState.Stop()अंत निष्पादन किया जाता है।

यहाँ एक उदाहरण है

Parallel.For(0, maximum_operations, options, (a, loopState) => 
    { 
     // do work 

     // cancellationToken.Cancel() should be called externally 
     if(token.IsCancellationRequested) 
     { 
      // cancellation requested - perform cleanup work if necessary 

      // then call 
      loopState.Break(); 
      // or 
      loopState.Stop(); 
     } 
    }); 

loopState.Break() पूरा सभी धागे कि मौजूदा धागे पर वर्तमान यात्रा से पहले कर रहे हैं पर सभी पुनरावृत्तियों का मतलब है, और फिर पाश (MSDN) से बाहर निकलें।

loopState.Stop() का मतलब है कि सभी पुनरावृत्तियों को जल्द से जल्द बंद करें (MSDN)।


एक और तरीका है निष्पादन समाप्त करने के लिए फोन token.ThrowIfCancellationRequested() है, लेकिन आप OperationCanceledException अपवाद को संभालने के लिए की आवश्यकता होगी:

public void MyMethod() 
{ 
    try 
    { 
     Parallel.For(0, maximum_operations, options, (a, loopState) => 
     { 
      // do work 

      token.ThrowIfCancellationRequested(); 
     }); 
    } 
    catch (OperationCanceledException) 
    { 
     // handle cancellation 
    } 
} 

इन सभी पद्धतियों का Parallel.For के निष्पादन समाप्त करने के लिए वैध तरीके हैं। आप जो भी उपयोग करते हैं वह आपकी आवश्यकताओं पर निर्भर करता है।

उदाहरण के लिए:

  • इसे करने के लिए तुरंत बंद सभी निष्पादन आवश्यक है जब आपके खिड़कियों सेवा बंद कर दिया है? फिर आप token.ThrowIfCancellationRequested()
  • का उपयोग कर सकते हैं क्या आपका लूप IDISposable ऑब्जेक्ट्स के साथ सौदा करता है जिन्हें सफाई की आवश्यकता है? तो फिर तुम संदर्भ के लिए loopState.Break() या loopState.Stop()

कुछ लेख इस्तेमाल कर सकते हैं:

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