关于Task.Start()的使用,Task.Run()和Task.Factory.StartNew()
我刚刚看到了三个关于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()
?
请帮助我通过示例详细了解他们的实际使用情况,谢谢。
Task.Run
是Task.Run
的简写,具有特定的安全参数:
Task.Factory.StartNew( action, CancellationToken.None, TaskCreationOptions.DenyChildAttach, TaskScheduler.Default);
它被添加到.Net 4.5中以帮助越来越频繁地使用async
和卸载工作到ThreadPool
。
Task.Factory.StartNew
(与.NET 4.0中的TPL Task.Factory.StartNew
添加)更健壮。 你应该只使用它,如果Task.Run
是不够的,例如当你想使用TaskCreationOptions.LongRunning
(虽然它是没有必要的,当委托是asynchronous的更多在我的博客上: LongRunning是无用的Task.Run与asynchronous等待 )。 更多关于Task.Factory.StartNew
的Task.Run与Task.Factory.StartNew
除非你find一个非常好的理由,否则不要创buildTask
并调用Start()
。 只有在某些部分需要创build任务但不安排时间的情况下才能使用,而另一部分则不需要创build时间表。 这几乎不是一个合适的解决scheme,可能是危险的。 更多在“Task.Factory.StartNew”vs“新任务(…)。开始”
总之,大多数情况下使用Task.Run
,如果您必须使用Task.Factory.StartNew
并且从不使用Start
。
除了答案之外,你不应该从构造函数中创build一个没有令人信服的理由的任务。 TPL在同步和并发性方面需要很多的关注,它将这些复杂性从客户端代码中隐藏起来。 如果构build一个任务并启动它,则需要考虑显然难以处理的同步和并发性。