Второй метод, Task.Runбыл представлен в более поздней версии .NET Framework (в .NET 4.5).
Тем не менее, первый метод Task.Factory.StartNewдает вам возможность определить множество полезных вещей о потоке, который вы хотите создать, но Task.Runне предоставляет этого.
Например, допустим, вы хотите создать длительный поток задач. Если поток пула потоков будет использоваться для этой задачи, то это может рассматриваться как злоупотребление пулом потоков.
Чтобы этого избежать, вы могли бы выполнить задачу в отдельном потоке. Недавно созданный поток , который будет посвящен этой задаче и будет уничтожен, как только ваша задача будет завершена. Вы не можете достичь этого с помощью Task.Run, в то время как вы можете сделать это с помощью Task.Factory.StartNew, как показано ниже:
Task.Factory.StartNew(..., TaskCreationOptions.LongRunning);
Как указано здесь :
Итак, в .NET Framework 4.5 Developer Preview мы представили новый метод Task.Run. Это ни в коем случае не устаревает Task.Factory.StartNew,
а скорее должно рассматриваться как быстрый способ использовать
Task.Factory.StartNew без необходимости указывать кучу параметров. Это ярлык. Фактически, Task.Run фактически реализован в рамках той же логики, что и Task.Factory.StartNew, просто передавая некоторые параметры по умолчанию. Когда вы передаете действие в Task.Run:
Task.Run(someAction);
это в точности эквивалентно:
Task.Factory.StartNew(someAction,
CancellationToken.None, TaskCreationOptions.DenyChildAttach, TaskScheduler.Default);
StartNewпо умолчанию,TaskScheduler.Currentкоторое может быть пулом потоков, но также может быть потоком пользовательского интерфейса.