Относительно использования задачи.Start (), Task.Run () и Task.Фабрика.StartNew()


Я только что видел 3 процедуры, касающиеся использования TPL, которые выполняют ту же работу; вот код:

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

я просто не понимаю, почему MS дает 3 разных способа запуска заданий в TPL, потому что все они работают одинаково: Task.Start(),Task.Run() и Task.Factory.StartNew().

подскажите,Task.Start(),Task.Run() и Task.Factory.StartNew() все они используются для одной и той же цели или имеют разное значение?

когда следует использовать Task.Start(), когда нужно использовать Task.Run() и когда надо используйте Task.Factory.StartNew()?

пожалуйста, помогите мне понять их реальное использование в соответствии со сценарием в деталях с примерами, спасибо.

1 112

1 ответ:

Task.Run это сокращение для Task.Factory.StartNew с конкретными безопасными аргументами:

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

он был добавлен в .Net 4.5, чтобы помочь с более частым использованием async и разгрузка работы в ThreadPool.

Task.Factory.StartNew (добавлено с TPL в .Net 4.0) является гораздо более надежным. Вы должны использовать его только если Task.Run недостаточно, например, когда вы хотите использовать TaskCreationOptions.LongRunning (хотя это не нужно, когда делегат асинхронный. Подробнее об этом в моем блоге:LongRunning Is Бесполезно Для Задачи.Запуск с помощью async-await). Подробнее о Task.Factory.StartNew на задач.Запуск против задачи.Фабрика.StartNew

никогда не создать Task и звонок Start() если вы не найдете очень вескую причину для этого. Он должен использоваться только в том случае, если у вас есть какая-то часть, которая должна создавать задачи, но не планировать их, а другая часть, которая планирует без создания. Это почти никогда не является подходящим решением и может быть опасным. Еще в "задачи.Фабрика.StartNew " vs "новая задача.(..).Старт"

в заключение, в основном использовать Task.Run используйте Task.Factory.StartNew Если вы должны и никогда не используйте Start.