2016-03-21 7 views
8

केवल "कार्रवाई" पैरामीटर के साथ TaskFactory.StartNew बुला का सबसे सामान्य रूप इसके अलावा (1) https://msdn.microsoft.com/en-us/library/dd321439(v=vs.110).aspxTaskFactory.StartNew को रद्दीकरण टोकन क्यों पास करें?

हम वरना एक विधि है कि "निरस्तीकरण टोकन" (2) https://msdn.microsoft.com/en-us/library/dd988458.aspx

के रूप में एक अतिरिक्त पैरामीटर स्वीकार करता है

मेरा सवाल है, हमें कॉल (2) के बजाय कॉल (2) का उपयोग क्यों करना चाहिए?

मेरा मतलब है, पृष्ठ के लिए MSDN में उदाहरण (2) भी अगर मैं पैरामीटर के रूप में रद्द टोकन उत्तीर्ण नहीं होते हैं (क्योंकि चर टोकन प्रतिनिधि समारोह से पहुँचा जा सकता है काम करेगा तरह:।

var tokenSource = new CancellationTokenSource(); 
     var token = tokenSource.Token; 
     var files = new List<Tuple<string, string, long, DateTime>>(); 

     var t = Task.Factory.StartNew(() => { string dir = "C:\\Windows\\System32\\"; 
           object obj = new Object(); 
           if (Directory.Exists(dir)) { 
            Parallel.ForEach(Directory.GetFiles(dir), 
            f => { 
              if (token.IsCancellationRequested) 
               token.ThrowIfCancellationRequested(); 
              var fi = new FileInfo(f); 
              lock(obj) { 
               files.Add(Tuple.Create(fi.Name, fi.DirectoryName, fi.Length, fi.LastWriteTimeUtc));   
              } 
             }); 
           } 
           } 
         ); //note that I removed the ", token" from here 
     tokenSource.Cancel(); 

तो वहाँ कुछ भी नीचे हो रहा है जब मैं Task.Factory.StartNew को रद्द करने टोकन पारित धन्यवाद

है?

उत्तर

7

दो बातें नहीं होगा।

  1. यदि स्टार्टन्यू कहा जाता है तो टोकन रद्द कर दिया गया है, यह कभी भी धागा शुरू नहीं करेगा और कार्य Canceled स्थिति में होगा।
  2. यदि OperationCanceledException कार्य के अंदर से उठाया गया है और उस अपवाद को उसी टोकन में StartNew के रूप में पारित किया गया था, तो यह लौटा कार्य Cancelled स्थिति दर्ज करने का कारण बन जाएगा। यदि अपवाद से जुड़े टोकन एक अलग टोकन है या आपने कार्य में टोकन पास नहीं किया है तो Faulted स्थिति दर्ज करेगा।

पीएस आपको TaskScheduler में गुजरने के बिना कभी भी Task.Factory.StartNew पर कॉल नहीं करना चाहिए क्योंकि यदि आप आसानी से cause you to run code on the UI thread that you expected to run on a background thread नहीं कर सकते हैं। Task.Run( का उपयोग तब तक करें जब तक आपको StartNew, Task.Run का उपयोग करने की आवश्यकता नहीं है, CancellationToken व्यवहार StartNew जैसा व्यवहार है।

+0

'कार्य। फैक्टरी' का उपयोग न करने के बारे में शब्द फैलाने के लिए धन्यवाद। – kai

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