2015-04-17 9 views
99

मैं सिर्फ देखा TPL उपयोग जो यहाँ एक ही कामTask.Start(), Task.Run() और Task.Factory.StartNew()

करता है के बारे में 3 दिनचर्या कोड

public static void Main() 
{ 
    Thread.CurrentThread.Name = "Main"; 

    // Create a task and supply a user delegate by using a lambda expression. 
    Task taskA = new Task(() => Console.WriteLine("Hello from taskA.")); 
    // Start the task. 
    taskA.Start(); 

    // Output a message from the calling thread. 
    Console.WriteLine("Hello from thread '{0}'.", 
        Thread.CurrentThread.Name); 
    taskA.Wait(); 
} 

public static void Main() 
{ 
    Thread.CurrentThread.Name = "Main"; 

    // Define and run the task. 
    Task taskA = Task.Run(() => Console.WriteLine("Hello from taskA.")); 

    // Output a message from the calling thread. 
    Console.WriteLine("Hello from thread '{0}'.", 
         Thread.CurrentThread.Name); 
    taskA.Wait(); 
} 

public static void Main() 
{ 
    Thread.CurrentThread.Name = "Main"; 

    // Better: Create and start the task in one operation. 
    Task taskA = Task.Factory.StartNew(() => Console.WriteLine("Hello from taskA.")); 

    // Output a message from the calling thread. 
    Console.WriteLine("Hello from thread '{0}'.", 
        Thread.CurrentThread.Name); 

    taskA.Wait();     
} 
है के उपयोग के बारे में

मुझे समझ में नहीं आता कि क्यों एमएस टीपीएल में नौकरी चलाने के 3 अलग-अलग तरीकों को देता है क्योंकि वे सभी एक ही काम करते हैं: Task.Start(), Task.Run() और Task.Factory.StartNew()

मुझे बताएं, Task.Start(), Task.Run() और Task.Factory.StartNew() सभी एक ही उद्देश्य के लिए उपयोग किए गए हैं या उनके पास अलग-अलग महत्व हैं?

जब किसी को Task.Start() का उपयोग करना चाहिए, जब Task.Run() और जब किसी को Task.Factory.StartNew() का उपयोग करना चाहिए?

उदाहरण के साथ धन्यवाद, परिदृश्य के अनुसार परिदृश्य के अनुसार कृपया उनके वास्तविक उपयोग को समझने में मेरी सहायता करें।

Task.Factory.StartNew(
    action, 
    CancellationToken.None, 
    TaskCreationOptions.DenyChildAttach, 
    TaskScheduler.Default); 

यह नेट 4.5 में जोड़ा गया async की तेजी से बार-बार उपयोग और ThreadPool को उतारने काम के साथ मदद करने के लिए:

+0

एक [पुराना आलेख बता रहा है कि यहां] [http://blogs.msdn.com/b/pfxteam/archive/2010/06/13/10024153.aspx) और [यहां नए 'कार्य' के लिए '] (http://blogs.msdn.com/b/pfxteam/archive/2011/10/24/10229468.aspx) - शायद यह आपके प्रश्न का उत्तर देगा;) – Carsten

+0

[यहां] (http://stackoverflow.com/ए/21427264/1768303) एक उदाहरण है जहां 'कार्य। स्टार्ट' वास्तव में उपयोगी है। – Noseratio

उत्तर

108

Task.Run विशिष्ट सुरक्षित तर्क के साथ Task.Factory.StartNew के लिए एक आशुलिपि है।

Task.Factory.StartNew (.NET 4.0 में टीपीएल के साथ जोड़ा गया) बहुत अधिक मजबूत है। यदि आपको Task.Run पर्याप्त नहीं है, तो आपको केवल इसका उपयोग करना चाहिए, उदाहरण के लिए जब आप TaskCreationOptions.LongRunning का उपयोग करना चाहते हैं (हालांकि जब प्रतिनिधि प्रतिनिधि एसिंक है तो यह अनावश्यक है। मेरे ब्लॉग पर अधिक: LongRunning Is Useless For Task.Run With async-await)। Task.Run vs Task.Factory.StartNew

में Task.Factory.StartNew पर अधिक कभी एक Task बना सकते हैं और Start() फोन जब तक आप ऐसा करने के लिए एक बहुत ही अच्छा कारण खोजने मत करो। इसका उपयोग केवल तभी किया जाना चाहिए जब आपके पास कुछ ऐसा हिस्सा हो जिसे कार्यों को बनाने की आवश्यकता हो लेकिन उन्हें शेड्यूल न करें और अन्य भाग जो शेड्यूल किए बिना शेड्यूल करें। यह लगभग कभी भी उचित समाधान नहीं है और यह खतरनाक हो सकता है। "Task.Factory.StartNew" vs "new Task(...).Start"

निष्कर्ष में, अधिकतर Task.Run का उपयोग करें, Task.Factory.StartNew का उपयोग करें यदि आपको Start का उपयोग करना चाहिए और कभी भी उपयोग नहीं करना चाहिए।

+2

आपने कहा "कभी भी कोई कार्य न करें और कॉल प्रारंभ करें()" मुझे किसी भी अच्छे लेखन पर रीडायरेक्ट करें जो दिखाएगा कि टास्क.स्टार्ट() द्वारा कारण हो सकता है। मुझे विवरण चाहिए क्योंकि आप इससे बचने के लिए कह रहे हैं। जवाब के लिए धन्यवाद। – Mou

+0

@Mou मेरे पास पहले से ही है ... – i3arnon

+0

क्या आप इस लिंक के बारे में बात कर रहे हैं http://blogs.msdn.com/b/pfxteam/archive/2010/06/13/10024153.aspx ?? – Mou

0

उत्तर के अतिरिक्त, आपको बिना किसी कारण के कन्स्ट्रक्टर से कार्य नहीं बनाना चाहिए। टीपीएल सिंक्रनाइज़ेशन और समवर्तीता के साथ बहुत सावधानी बरतता है। यह क्लाइंट कोड से उन जटिलताओं को छुपाता है। यदि आप कोई कार्य बनाते हैं और इसे प्रारंभ करते हैं, तो आपको सिंक्रनाइज़ेशन और समरूपता के बारे में सोचना होगा जो स्पष्ट रूप से संभालना मुश्किल है।

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