关于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.RunTask.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一个任务并启动它,则需要考虑显然难以处理的同步和并发性。