我刚刚看到 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( )
?
请通过示例帮助我根据场景详细了解它们的实际用法,谢谢。
最佳答案
Task.Run
是带有特定安全参数的 Task.Factory.StartNew
的简写:
Task.Factory.StartNew(
action,
CancellationToken.None,
TaskCreationOptions.DenyChildAttach,
TaskScheduler.Default);
它是在 .Net 4.5 中添加的,以帮助处理越来越频繁地使用 async
并将工作卸载到 ThreadPool
。
Task.Factory.StartNew
(在 .Net 4.0 中添加了 TPL)更加健壮。你应该只在 Task.Run
不够时使用它,例如当你想使用 TaskCreationOptions.LongRunning
时(尽管当委托(delegate)是异步时没有必要。更多关于在我的博客上:LongRunning Is Useless For Task.Run With async-await)。关于 Task.Factory.StartNew
的更多信息,请参见 Task.Run vs Task.Factory.StartNew
永远不要创建一个 Task
并调用 Start()
除非你找到一个非常好的理由这样做。仅当您有一部分需要创建任务但不安排任务而另一部分无需创建即可安排任务时才应使用它。这几乎从来都不是一个合适的解决方案,而且可能很危险。更多内容 "Task.Factory.StartNew" vs "new Task(...).Start"
总而言之,大多数情况下使用 Task.Run
,如果必须且永远不要使用 Start
,请使用 Task.Factory.StartNew
。
关于c# - 关于 Task.Start() 、 Task.Run() 和 Task.Factory.StartNew() 的用法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29693362/