gpt4 book ai didi

c# - Task.Run() 和 Task.Factory.StartNew() 有什么区别

转载 作者:IT王子 更新时间:2023-10-29 03:32:24 31 4
gpt4 key购买 nike

我有方法:

private static void Method()
{
Console.WriteLine("Method() started");

for (var i = 0; i < 20; i++)
{
Console.WriteLine("Method() Counter = " + i);
Thread.Sleep(500);
}

Console.WriteLine("Method() finished");
}

我想在一个新任务中启动这个方法。我可以像这样开始新任务

var task = Task.Factory.StartNew(new Action(Method));

或者这个

var task = Task.Run(new Action(Method));

但是 Task.Run()Task.Factory.StartNew() 之间有什么区别吗?他们都在使用 ThreadPool 并在创建任务实例后立即启动 Method()。我们什么时候应该使用第一个变体,什么时候应该使用第二个?

最佳答案

第二种方法,Task.Run,已在更高版本的 .NET Framework 中引入(在 .NET 4.5 中)。

但是,第一个方法 Task.Factory.StartNew 让您有机会定义有关要创建的线程的许多有用的东西,而 Task.Run 没有提供这个。

例如,假设您要创建一个长时间运行的任务线程。如果线程池的一个线程将被用于这个任务,那么这可以被认为是对线程池的滥用。

为了避免这种情况,您可以做的一件事是在单独的线程中运行任务。一个新创建的线程专用于此任务,一旦您的任务完成就会被销毁。不能使用 Task.Run< 实现此目的,而您可以使用 Task.Factory.StartNew 执行此操作,如下所示:

Task.Factory.StartNew(..., TaskCreationOptions.LongRunning);

如前所述here :

So, in the .NET Framework 4.5 Developer Preview, we’ve introduced thenew Task.Run method. This in no way obsoletes Task.Factory.StartNew,but rather should simply be thought of as a quick way to useTask.Factory.StartNew without needing to specify a bunch ofparameters. It’s a shortcut. In fact, Task.Run is actuallyimplemented in terms of the same logic used for Task.Factory.StartNew,just passing in some default parameters. When you pass an Action toTask.Run:

Task.Run(someAction);

that’s exactly equivalent to:

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

关于c# - Task.Run() 和 Task.Factory.StartNew() 有什么区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38423472/

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