gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 03:33:30 27 4
gpt4 key购买 nike

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

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com