小编典典

关于Task.Start(),Task.Run()和Task.Factory.StartNew()的用法

c#

我只看到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()

请帮助我详细了解实例的实际用法,谢谢。


阅读 1407

收藏
2020-05-19

共1个答案

小编典典

Task.RunTask.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(尽管当委托异步时这是不必要的。有关我的博客的更多信息:LongRunning对于Task.Run
with async-await是无用的
)。更多关于Task.Factory.StartNewTask.Run VS
Task.Factory.StartNew

除非您找到极好的理由,否则不要创建Taskand进行呼叫Start()。仅当您有一部分需要创建任务但不计划任务而另一部分计划不创建时才应使用它。那几乎永远不是一个合适的解决方案,并且可能很危险。更多的“Task.Factory.StartNew”与“新任务(......)。开始”

总之,多数情况下使用Task.RunTask.Factory.StartNew如果必须且永远不要使用Start

2020-05-19