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

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相关问答推荐

Azure Function应用程序-如何升级.NET运行时

在 Git for Visual Studio 2012 中恢复到以前的提交

为什么(真的吗?)List 实现所有这些接口,而不仅仅是 IList

将 Topshelf 应用程序安装为 Windows 服务

支持 HTTPS 的 Httplistener

C# 属性实际上是方法吗?

.NET 如何判断路径是否是文件而不是目录?

当程序员说针对接口而不是对象的代码时,他们是什么意思?

.Net 中 AOP 的最佳实现是什么?

如何仅在需要时提升权限?

静态方法继承的正确替代方法是什么?

将两个列表映射到 C# 中的字典中

找不到库 hostpolicy.dll

什么是 .NET 应用程序域?

使 HashSet 不区分大小写

判断对象列表是否包含具有特定值的属性

如何在不使用 3rd 方库的情况下登录 C#?

如何在 C# 中使用迭代器反向读取文本文件

在 C# 中转义无效的 XML 字符

WinForms 中的模型视图演示者