gpt4 book ai didi

c# - Task.Run 是否会因 I/O 绑定(bind)操作产生开销?

转载 作者:行者123 更新时间:2023-12-02 12:14:57 60 4
gpt4 key购买 nike

我想以异步方式下载数据通过 HttpClient 来自各种服务(出于测试目的,我使用 Task.Delay 创建了一些方法)。所以首先我决定创建任务列表,然后使用await Task.WhenAll(tasks) 等待一切。

一切都按我想要的方式工作,但是如果我将 lambda 传递给 tasks.Add()。我必须使用 Task.Run 因为没有它就无法在内部使用等待。

所以我的问题是:

这个Task.Run()会产生额外的开销吗?因为对于 I/O 绑定(bind)操作,我们不应该使用 Task.Run 而应该使用简单的异步等待。

class Program
{
public static async Task<int> DownloadDelay15()
{ await Task.Delay(15000); return 15; }

public static async Task<int> DownloadDelay2()
{ await Task.Delay(1000); return 2; }

static async Task Main(string[] args)
{
var tasks = new List<Task<int>>();
tasks.Add(DownloadDelay15());
tasks.Add(DownloadDelay2());
tasks.Add(Task.Run(async () => //additional overhead?
{
await Task.Delay(1000);
return 6;
}));

var watch = Stopwatch.StartNew();
var results = await Task.WhenAll(tasks);
watch.Stop();
var elapsedSeconds = watch.Elapsed.Seconds;
}
}

最佳答案

if I pass lambda to tasks.Add(). I have to use Task.Run because without it can't use await inside.

您无法将 lambda 传递给 Add;您需要将 Task 传递给 Add。您可以通过创建另一个方法来做到这一点:

async Task<int> DownloadDelay6()
{
await Task.Delay(1000);
return 6;
}

var tasks = new List<Task<int>>();
tasks.Add(DownloadDelay15());
tasks.Add(DownloadDelay2());
tasks.Add(DownloadDelay6());

Does this Task.Run() will generate additonal overhead? Because with IO bound operation we shouldn't use Task.Run but simple async await.

是的; Task.Run 在线程池线程上运行其委托(delegate),因此存在一些额外的开销。虽然不多,但也有。

关于c# - Task.Run 是否会因 I/O 绑定(bind)操作产生开销?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59741440/

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