Подтвердить что ты не робот

Ожидание Task.Factory.StartNew(() => против Task.Start; ожидание задачи;

Существует ли какая-либо функциональная разница между этими двумя формами использования?

  • string x = await Task.Factory.StartNew(() => GetAnimal("feline"));
    
  • Task<string> myTask = new Task<string>(() => GetAnimal("feline"));
    myTask.Start();
    string z = await myTask;
    

В частности, в каком порядке каждая операция называется в 1.? Вызывается ли StartNew, а затем вызван или вызван первым в 1.?

4b9b3361

Ответ 1

StartNew - это просто короткая рука для создания и запуска задачи. Если вы хотите что-то сделать с экземпляром Task перед его запуском, используйте конструктор. Если вы просто хотите сразу создать и запустить задачу, используйте короткую руку.

Документация для StartNew говорит:

Вызов StartNew функционально эквивалентен созданию задачи посредством используя один из его конструкторов, а затем вызывая метод Task.Start запланировать выполнение задачи.

Ответ 2

Когда вы пишете код с async и await, вы должны использовать Task.Run, когда это возможно.

Конструктор TaskTask.Start) - это задержки из параллельной библиотеки задач, используемые для создания задач, которые еще не запущены. Конструктор Task и Task.Start не должны использоваться в коде async.

Аналогично, TaskFactory.StartNew - это более старый метод, который не использует лучшие значения по умолчанию для задач async и не понимает async lambdas. Это может быть полезно в нескольких ситуациях, но подавляющее большинство времени Task.Run лучше для кода async.

Ответ 3

Нет никакой разницы. Они производят один и тот же IL-код.