Dotyczące korzystania z zadania.Start (), Zadanie.Run() i Task.Fabryka.StartNew()

Właśnie widziałem 3 procedury dotyczące użycia TPL, które wykonują tę samą pracę; oto kod:

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();                  
}

Tylko nie rozumiem dlaczego MS daje 3 różne sposoby uruchamiania zadań w TPL bo wszystkie działają tak samo: Task.Start(), Task.Run() i Task.Factory.StartNew().

Powiedz mi, Czy Task.Start(), Task.Run() i Task.Factory.StartNew() wszystkie używane do tego samego celu, czy mają inne znaczenie?

Kiedy należy stosować Task.Start(), Kiedy należy stosować Task.Run() i kiedy należy stosować Task.Factory.StartNew()?

Proszę o pomoc zrozum ich rzeczywiste użycie zgodnie ze scenariuszem bardzo szczegółowo z przykładami, dzięki.

Author: rory.ap, 2015-04-17

1 answers

Task.Run jest skrótem Task.Factory.StartNew z określonymi bezpiecznymi argumentami:

Task.Factory.StartNew(
    action, 
    CancellationToken.None, 
    TaskCreationOptions.DenyChildAttach, 
    TaskScheduler.Default);
[14]}został dodany w.Net 4.5, aby pomóc w coraz częstszym używaniu async i przenoszeniu pracy do ThreadPool.

Task.Factory.StartNew (dodany z TPL w. Net 4.0) jest znacznie bardziej wytrzymały. Powinieneś używać go tylko wtedy, gdy Task.Run nie wystarczy, na przykład, gdy chcesz użyć TaskCreationOptions.LongRunning (chociaż jest to niepotrzebne, gdy delegat jest asynchroniczny. Więcej na ten temat na moim blogu: LongRunning jest bezużyteczny do zadań.Run With async-wait ). Więcej o Task.Factory.StartNew w Task.Run vs zadanie.Fabryka.StartNew

Nigdy nie twórz Task i nie dzwoń Start(), chyba że znajdziesz Bardzo dobry powód, aby to zrobić. Powinien być używany tylko wtedy, gdy masz część, która musi tworzyć zadania, ale nie planować ich i inną część, która planuje bez tworzenia. To prawie nigdy nie jest odpowiednie rozwiązanie i może być niebezpieczne. Więcej w " zadanie.Fabryka.StartNew "vs" nowe zadanie(...).Start "

Podsumowując, najczęściej używaj Task.Run, używaj Task.Factory.StartNew jeśli musisz I nigdy nie używaj Start.

 126
Author: i3arnon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-01-19 07:41:25