我刚刚看到了三个关于第三方物流使用的程序,它们做同样的工作;以下是代码:

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();                  
}

我就是不明白为什么微软在第三方物流中提供了3种不同的方式来运行作业(job),因为它们的工作方式都是一样的:Task.Start()Task.Run()Task.Factory.StartNew().

告诉我,Task.Start()Task.Run()Task.Factory.StartNew()是同一用途,还是意义不同?

什么时候用Task.Start(),什么时候用Task.Run(),什么时候用Task.Factory.StartNew()

请帮助我了解他们的实际使用情况,根据场景非常详细的例子,谢谢.

推荐答案

Task.RunTask.Factory.StartNew的缩写,带有特定的安全参数:

Task.Factory.StartNew(
    action, 
    CancellationToken.None, 
    TaskCreationOptions.DenyChildAttach, 
    TaskScheduler.Default);

它是在.NET4.5中添加的,以帮助更频繁地使用async,并将工作卸载到ThreadPool.

Task.Factory.StartNew(在.Net 4.0中添加了TPL)更加健壮.只有在Task.Run还不够的情况下才应该使用它,例如,当你想使用TaskCreationOptions.LongRunning时(尽管在委托是异步的情况下它是不必要的.更多关于这一点,请参阅我的博客:LongRunning Is Useless For Task.Run With async-await).更多关于Task.Run vs Task.Factory.StartNew中的Task.Factory.StartNew

永远不要创建Task并拨打Start(),除非你找到一个非常好的理由这样做.只有当您有需要创建任务但不计划任务的某些部分和计划而不创建的另一个部分时,才应该使用它.这几乎从来都不是一个合适的解决方案,而且可能是危险的."Task.Factory.StartNew" vs "new Task(...).Start"人中有更多

总之,主要使用Task.Run,如果必须使用Task.Factory.StartNew,不要使用Start.

.net相关问答推荐

[x.x.x,)在Packages.lock.json依赖项中是什么意思?

.NET模拟具有泛型返回类型的方法

NuGet 兼容与计算框架(Xamarin 和 .NET 6)

是否有内置方法将 nuget 包引用为 csproj 中的文件?

使用 MassTransit、.NET Core 和 RabbitMQ 的设计挑战

如何以编程方式判断类型是 struct 还是类?

如何防止和/或处理 StackOverflowException?

extern 在 C# 中是如何工作的?

哪个单元测试框架?

序列化私有成员数据

如何将 UI Dispatcher 传递给 ViewModel

您可以在 C# 代码中捕获本机异常吗?

在 .NET Core RC2 中构建 .exe 文件

如何异步 Files.ReadAllLines 并等待结果?

在同一解决方案中引用 2 个不同版本的 log4net

您可以使用 Xamarin 开发 Linux 应用程序吗?

IEnumerable vs IReadonlyCollection vs ReadonlyCollection 用于公开列表成员

在 IIS 中访问 .svc 文件时出现 HTTP 404

C# ListView 列宽自动

枚举和匹配属性的 C# 命名约定