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