Другий метод, Task.Run
був введений в більш пізній версії рамки .NET (в .NET 4.5).
Однак перший метод, Task.Factory.StartNew
дає вам змогу визначити багато корисних речей про нитку, яку ви хочете створити, але Task.Run
не надає цього.
Наприклад, скажімо, що ви хочете створити довгу нитку завдань. Якщо для цього завдання буде використовуватися нитка пулу потоків, то це може вважатися зловживанням пулом потоків.
Одне, що ви могли зробити для того, щоб уникнути цього, було б запустити завдання в окрему нитку. Новостворена нитка, яка була б присвячена цій задачі та була б знищена, як тільки ваше завдання буде виконане. Ви не можете досягти цього з Task.Run
, в той час як ви можете зробити це з Task.Factory.StartNew
, як показано нижче:
Task.Factory.StartNew(..., TaskCreationOptions.LongRunning);
Як зазначено тут :
Отже, у перегляді розробників .NET Framework 4.5 ми представили новий метод 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
яке може бути пулом потоків, але також може бути потоком UI.