Task.Factory.StartNew vs new Task
Кто-нибудь знает, есть ли разница между выполнением Task.Factory.StartNew
vs new Task
, а затем вызовом Start
в задаче. Глядя на отражатель, похоже, нет большой разницы. Поэтому, возможно, единственное отличие состоит в том, что Task.Factory.StartNew
возвращает задание, которое уже запущено. Правильно ли это?
Я знаю, что Task.Factory.StartNew
и Task.Run
имеют разные параметры по умолчанию, а Task.Run
- предпочтительный вариант .Net 4.5.
Ответы
Ответ 1
Я нашел эту отличную статью Стивена Тууба, в которой объясняется, что при использовании new Task(...).Start()
на самом деле существует штраф за производительность, так как в методе начала необходимо использовать синхронизацию убедитесь, что задача запланирована только один раз.
Его совет - предпочесть использовать Task.Factory.StartNew
для .net 4.0. Для .net 4.5 Task.Run
есть лучший вариант.
Ответ 2
Фактически в статье Стивена Тууба он указывает, что Task.Run() в точности эквивалентен использованию Task.Factory.StartNew() с параметрами по умолчанию:
Task.Factory.StartNew(someAction,
CancellationToken.None, TaskCreationOptions.DenyChildAttach, TaskScheduler.Default);