2015-01-14 8 views
10

अगर वहाँ CancellationTokenSource और बाहर निकलने ध्वज के साथ समाप्त पाश कार्य के बीच कोई अंतर है मैं सोच रहा थाअंतर

CancellationTokenSource:

CancellationTokenSource cancellationTokenSource; 
Task loopTask; 

void StartLoop() 
{ 
    cancellationTokenSource = new CancellationTokenSource(); 
    loopTask = Task.Factory.StartNew(Loop, TaskCreationOptions.LongRunning); 
} 

void Loop() 
{ 
    while (true) 
    { 
     if (cancellationTokenSource.IsCancellationRequested) 
      break; 

     Thread.Yield(); 
    } 
} 

void StopLoop() 
{ 
    cancellationTokenSource.Cancel(); 

    loopTask = null; 
    cancellationTokenSource = null; 
} 

बाहर निकलें झंडा:

volatile bool exitLoop; 
Task loopTask; 

void StartLoop() 
{ 
    exitLoop = false; 
    loopTask = Task.Factory.StartNew(Loop, TaskCreationOptions.LongRunning); 
} 

void Loop() 
{ 
    while (true) 
    { 
     if (exitLoop) 
      break; 

     Thread.Yield(); 
    } 
} 

void StopLoop() 
{ 
    exitLoop = true; 

    loopTask = null; 
} 

मेरे लिए यह कोई भी नहीं बनाता है रद्दीकरण टोकनसोर्स का उपयोग करने के लिए sance, btw कोई कारण है कि रद्दीकरण टोकन टास्क फैक्ट्री के पैरामीटर के रूप में क्यों जोड़ा जा सकता है?

किसी भी प्रकार के उत्तर के लिए आपको बहुत बहुत धन्यवाद।

बेस्ट ragards teamol

उत्तर

9
  1. एक CancellationToken की अनुमति देता है सभी आवश्यक तुल्यकालन को संभालने के लिए है, तो आप इसके बारे में सोचने के लिए की जरूरत नहीं है टोकन का उपयोग करना।
  2. जब Task दोषों को इसके निर्माण में उपयोग किए जाने वाले टोकन के कारण रद्द कर दिया गया है तो इसे रद्द करने के बजाय Task की स्थिति को रद्द कर दिया गया है। यदि आप एक बुलियन (और फेंक नहीं देते) का उपयोग करते हैं तो कार्य वास्तव में सफलतापूर्वक पूरा होने के रूप में चिह्नित किया जाएगा, भले ही इसे वास्तव में रद्द कर दिया गया हो।
  3. बूलियन के विपरीत यह एक संदर्भ प्रकार है, इसलिए सीटीएस के संदर्भ को पास किया जा सकता है और अन्य स्थानों से रद्द किया जा सकता है (या निरीक्षण किया जा सकता है)। यह महत्वपूर्ण है कि इन स्थानों को एक साथ युग्मित करने की आवश्यकता नहीं है जैसे कि यदि आप एक बुलियन क्षेत्र का उपयोग करते हैं तो वे करेंगे; न तो ऑपरेशन रद्द होने पर निर्णय लेने वाला कोड, न ही रद्दीकरण पर प्रतिक्रिया देने वाले किसी भी कोड को एक-दूसरे के बारे में जानना आवश्यक है। यह अधिक मॉड्यूलरलाइजेशन, एब्स्ट्रक्शन, कार्यक्षमता के उच्च स्तर व्यक्तिगत परिस्थितियों के लिए विशिष्ट नहीं है, आदि
  4. यह कोड में उन्नत अर्थपूर्ण अर्थ जोड़ता है।
+0

क्या आप मुझे टास्ककैलेशनेशन के सही उपयोग का उदाहरण प्रदान कर सकते हैं? तो कार्य स्थिति चलने से बदलती है? और आप टोकन कैसे प्राप्त करेंगे जो स्टार्टन्यू विधि में पारित किया गया था? – Teamol

+0

@ टीमोल 'रन', 'स्टार्ट न्यू', और 'जारी रखें' सभी में रद्दीकरण टोकन के लिए पैरामीटर हैं। एक में पास करें। – Servy