Task.Start (), Task.Run () और Task.Factory.StartNew () के उपयोग के बारे में


143

मैंने अभी TPL के उपयोग के बारे में 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();                  
}

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

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

कब इस्तेमाल करना चाहिए Task.Start(), कब इस्तेमाल Task.Run()करना चाहिए और कब इस्तेमाल करना चाहिए Task.Factory.StartNew()?

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


एक पुराना लेख है जो यह समझा रहा है कि यहाँ और यहाँ नए के लिएTask.Run - शायद यह आपके सवाल का जवाब देगा;)
कार्स्टन

यहाँ एक उदाहरण है कि Task.Startवास्तव में कहाँ उपयोगी है।
noseratio

जवाबों:


171

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

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

इसे लगातार। नेट 4.5 में जोड़ा गया था ताकि इसके लगातार उपयोग asyncऔर ऑफलोडिंग के काम में मदद की जा सके ThreadPool

Task.Factory.StartNew(TPL in .net 4.0 के साथ जोड़ा गया) अधिक मजबूत है। आपको इसका उपयोग केवल तभी करना चाहिए Task.Runजब आप पर्याप्त न हों, उदाहरण के लिए जब आप उपयोग करना चाहते हैं TaskCreationOptions.LongRunning(हालांकि यह तब अनावश्यक है जब प्रतिनिधि async है। मेरे ब्लॉग पर उस पर और अधिक: LongRunning इस टास्क के लिए बेकार हैasync-wait के साथ ।) Task.Run बनाम Task.Factory.StartNewTask.Factory.StartNew में और अधिक

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

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


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

ru इस लिंक के बारे में बात कर रहे हैं blogs.msdn.com/b/pfxteam/archive/2010/06/13/10024153.aspp ??
मऊ

1
Task.Startज्यादातर प्रकार के विरासत के लिए @Mou का स्थान है।
युवल इट्ज़चकोव

1
@ यह अयोग्य है क्योंकि यह सुनिश्चित करने के लिए सिंक्रनाइज़ेशन की आवश्यकता है कि यह केवल एक बार कहा जाता है। अन्य विकल्प नहीं है।
i3arnon

2
@Mou आपको शायद इस मुद्दे को पढ़ने वाले पोस्ट को पढ़ना चाहिए। blogs.msdn.com/b/pfxteam/archive/2010/06/13/10024153.aspx
i3arnon

2

संक्षिप्त उत्तर :

यदि आप नेस्टेड बच्चों के कार्यों का उपयोग नहीं कर रहे हैं और हमेशा अपने कार्यों को थ्रेड पूल पर निष्पादित करना चाहते हैं तो इसका उपयोग करना बेहतर है Task.Run

लंबा जवाब:

Task.Runऔर Task.Factory.StartNewदोनों टास्क ऑब्जेक्ट बनाने और शेड्यूल करने के लिए समर्थन प्रदान करते हैं, इसलिए हमें एक Taskऔर कॉल करने की आवश्यकता नहीं हैStart()

Task.Run(action);

के बराबर है:

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

तथा

Task.Factory.StartNew(action);

के बराबर है:

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

Task.Runउपयोग TaskCreationOptions.DenyChildAttachजिसका अर्थ है कि बच्चों के कार्यों को माता-पिता के साथ संलग्न नहीं किया जा सकता है और इसका उपयोग करता है TaskScheduler.Defaultजिसका अर्थ है कि थ्रेड पूल पर कार्यों को चलाने वाला हमेशा कार्यों को चलाने के लिए उपयोग किया जाएगा।

Task.Factory.StartNewTaskScheduler.Currentवर्तमान धागे के अनुसूचक का उपयोग करता है , यह हो सकता है TaskScheduler.Defaultलेकिन हमेशा नहीं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.