c# - 关于 Task.Start() 、 Task.Run() 和 Task.Factory.StartNew() 的用法

标签 c# .net async-await task-parallel-library

我刚刚看到 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/

相关文章:

c# - MVC 中启用 Ajax 的 WCF 返回 404

java - 当成员与另一个类的公共(public)变量相同时使用 Enum

c# - 正则表达式 - 重复捕获

.net - "this"的启发式和闭包好吗? (表达式树)

wpf - WCF 异步操作并非真正异步

c# - Serilog RavenDb 接收器无法在 asp.net 5 应用程序中工作

c# - 动态构建连接字符串

c# - 在不同的 Entity Framework 模型中不能有相同的表名吗?

node.js - Node JS。我可以在一个地方处理错误吗?没有 try and catch block

javascript - 等待promise for循环