gpt4 book ai didi

c# - 运行异步 lambda 时,使用 Task.Run(func) 还是 new Func(func)()?

转载 作者:太空狗 更新时间:2023-10-29 22:56:55 28 4
gpt4 key购买 nike

我想收集/运行任务,然后对它们执行 Task.WhenAll

var tasks = new List<Task>();
foreach (var thing in things) {
tasks.Add(Task.Run(async () => {
// async stuff using thing
}));
}

var stuffs = await Task.WhenAll(tasks);

在这里使用 Task.Run 是正确的还是我应该这样做

tasks.Add(new Func<Task>(async () => {async stuff})());

还是完全不同的东西?

最佳答案

这通常取决于您的异步工作的性质。如果您执行以下操作:

async () => {
// some heavy CPU work here
// then some IO
}

最好使用 Task.Run,否则“繁重的 CPU 工作”将在您当前的线程上运行,您将获得很少的并行化。

然而,这种情况相对较少,因为对于繁重的 CPU 工作的并行化还有其他工具。如果你有这样的事情:

async () => {
// some async IO, like database call or web request
// some processing
// some more async IO
}

那么你就不需要Task.Run了。然后你可以使用你的第二种方法:

Func<Task> t = async () => {
// some stuff
};
tasks.Add(t());

如果您在 UI 线程(在 WPF\WinForms 中)上执行此操作 - 请确保在您的异步委托(delegate)中使用 ConfigureAwait(false) 以防止将控制返回到 UI 线程。

关于c# - 运行异步 lambda 时,使用 Task.Run(func) 还是 new Func<Task>(func)()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47400516/

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