gpt4 book ai didi

c# - 使用或不使用 Task.Run 将列表转换为任务列表?

转载 作者:行者123 更新时间:2023-12-04 10:27:41 25 4
gpt4 key购买 nike

所以我知道 Task.Run 基本上使代码在线程池中的新线程中运行。但是如果我做这样的事情有什么区别:

var tasks = new List<string>(){ "foo", "bar" }
.Select(e => Task.Run(async () => await Process(e)))
.ToList();

await Task.WhenAll(tasks);

对比
var tasks = new List<string>(){ "foo", "bar" }
.Select(async e => await Process(e))
.ToList();

await Task.WhenAll(tasks);

我的理解是,第二个片段在等待某个异步进程时一次只运行一个,而第一个片段实际上在线程池中的线程上并行运行它们?

最佳答案

这两种方法都会实例化一个任务列表,然后 await他们来完成。通常它们之间应该没有区别,除非 ProcessAsync方法返回已经完成的任务(除非它同步运行,换句话说)。例如下面的实现:

async Task ProcessAsync(string arg)
{
Thread.Sleep(1000); // Simulate some heavy calculation
await Task.CompletedTask;
}

...阻塞当前线程 1000 毫秒,然后返回一个已完成的任务。此实现将仅与第一种方法(使用 Task.Run )并行运行,并将与第二种方法(不使用 Task.Run )顺序运行。原因是创建任务成本高(所有工作都在创建过程中完成),等待任务成本低(任务已经完成)。与 Task.Run 您基本上将昂贵的工作卸载到 ThreadPool 线程。

关于c# - 使用或不使用 Task.Run 将列表转换为任务列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60563393/

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