Относительно использования задачи.Start (), Task.Run () и Task.Фабрика.StartNew()
Я только что видел 3 процедуры, касающиеся использования TPL, которые выполняют ту же работу; вот код:
public static void Main()
{
Thread.CurrentThread.Name = "Main";
// Create a task and supply a user delegate by using a lambda expression.
Task taskA = new Task( () => Console.WriteLine("Hello from taskA."));
// Start the task.
taskA.Start();
// Output a message from the calling thread.
Console.WriteLine("Hello from thread '{0}'.",
Thread.CurrentThread.Name);
taskA.Wait();
}
public static void Main()
{
Thread.CurrentThread.Name = "Main";
// Define and run the task.
Task taskA = Task.Run( () => Console.WriteLine("Hello from taskA."));
// Output a message from the calling thread.
Console.WriteLine("Hello from thread '{0}'.",
Thread.CurrentThread.Name);
taskA.Wait();
}
public static void Main()
{
Thread.CurrentThread.Name = "Main";
// Better: Create and start the task in one operation.
Task taskA = Task.Factory.StartNew(() => Console.WriteLine("Hello from taskA."));
// Output a message from the calling thread.
Console.WriteLine("Hello from thread '{0}'.",
Thread.CurrentThread.Name);
taskA.Wait();
}
я просто не понимаю, почему MS дает 3 разных способа запуска заданий в TPL, потому что все они работают одинаково: Task.Start()
,Task.Run()
и Task.Factory.StartNew()
.
подскажите,Task.Start()
,Task.Run()
и Task.Factory.StartNew()
все они используются для одной и той же цели или имеют разное значение?
когда следует использовать Task.Start()
, когда нужно использовать Task.Run()
и когда надо используйте Task.Factory.StartNew()
?
пожалуйста, помогите мне понять их реальное использование в соответствии со сценарием в деталях с примерами, спасибо.
1 ответ:
Task.Run
это сокращение дляTask.Factory.StartNew
с конкретными безопасными аргументами:Task.Factory.StartNew( action, CancellationToken.None, TaskCreationOptions.DenyChildAttach, TaskScheduler.Default);
он был добавлен в .Net 4.5, чтобы помочь с более частым использованием
async
и разгрузка работы вThreadPool
.
Task.Factory.StartNew
(добавлено с TPL в .Net 4.0) является гораздо более надежным. Вы должны использовать его только еслиTask.Run
недостаточно, например, когда вы хотите использоватьTaskCreationOptions.LongRunning
(хотя это не нужно, когда делегат асинхронный. Подробнее об этом в моем блоге:LongRunning Is Бесполезно Для Задачи.Запуск с помощью async-await). Подробнее оTask.Factory.StartNew
на задач.Запуск против задачи.Фабрика.StartNewникогда не создать
Task
и звонокStart()
если вы не найдете очень вескую причину для этого. Он должен использоваться только в том случае, если у вас есть какая-то часть, которая должна создавать задачи, но не планировать их, а другая часть, которая планирует без создания. Это почти никогда не является подходящим решением и может быть опасным. Еще в "задачи.Фабрика.StartNew " vs "новая задача.(..).Старт"в заключение, в основном использовать
Task.Run
используйтеTask.Factory.StartNew
Если вы должны и никогда не используйтеStart
.