我只看到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给出了三种不同的方式在运行第三方物流工作,因为他们所有的工作一样的:Task.Start(),Task.Run()和Task.Factory.StartNew()。
Task.Start()
Task.Run()
Task.Factory.StartNew()
你告诉我,Task.Start(),Task.Run()并Task.Factory.StartNew()全部用于同一目的,还是他们有不同的意义呢?
什么时候应该使用Task.Start(),什么时候应该使用Task.Run(),什么时候应该使用Task.Factory.StartNew()?
请帮助我详细了解实例的实际用法,谢谢。
Task.Run是Task.Factory.StartNew带有特定安全参数的简写:
Task.Run
Task.Factory.StartNew
Task.Factory.StartNew( action, CancellationToken.None, TaskCreationOptions.DenyChildAttach, TaskScheduler.Default);
在.Net 4.5中添加了它,以帮助日益频繁地使用async和卸载工作ThreadPool。
async
ThreadPool
Task.Factory.StartNew(在.Net 4.0中添加了TPL)更加健壮。您仅应在Task.Run不够用的情况下使用它,例如在您想使用时使用TaskCreationOptions.LongRunning(尽管当委托异步时这是不必要的。有关我的博客的更多信息:LongRunning对于Task.Run with async-await是无用的)。更多关于Task.Factory.StartNew在Task.Run VS Task.Factory.StartNew
TaskCreationOptions.LongRunning
除非您找到极好的理由,否则不要创建Taskand进行呼叫Start()。仅当您有一部分需要创建任务但不计划任务而另一部分计划不创建时才应使用它。那几乎永远不是一个合适的解决方案,并且可能很危险。更多的“Task.Factory.StartNew”与“新任务(......)。开始”
Task
Start()
总之,多数情况下使用Task.Run,Task.Factory.StartNew如果必须且永远不要使用Start。
Start