Второй метод, 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
которое может быть пулом потоков, но также может быть потоком пользовательского интерфейса.