Ожидание Task.Factory.StartNew(() => против Task.Start; ожидание задачи;
Существует ли какая-либо функциональная разница между этими двумя формами использования?
В частности, в каком порядке каждая операция называется в 1.? Вызывается ли StartNew, а затем вызван или вызван первым в 1.?
Ответы
Ответ 1
StartNew
- это просто короткая рука для создания и запуска задачи. Если вы хотите что-то сделать с экземпляром Task
перед его запуском, используйте конструктор. Если вы просто хотите сразу создать и запустить задачу, используйте короткую руку.
Документация для StartNew
говорит:
Вызов StartNew функционально эквивалентен созданию задачи посредством используя один из его конструкторов, а затем вызывая метод Task.Start запланировать выполнение задачи.
Ответ 2
Когда вы пишете код с async
и await
, вы должны использовать Task.Run
, когда это возможно.
Конструктор Task
(и Task.Start
) - это задержки из параллельной библиотеки задач, используемые для создания задач, которые еще не запущены. Конструктор Task
и Task.Start
не должны использоваться в коде async
.
Аналогично, TaskFactory.StartNew
- это более старый метод, который не использует лучшие значения по умолчанию для задач async
и не понимает async
lambdas. Это может быть полезно в нескольких ситуациях, но подавляющее большинство времени Task.Run
лучше для кода async
.
Ответ 3
Нет никакой разницы. Они производят один и тот же IL-код.