gpt4 book ai didi

c# - 异步一直向下问题

转载 作者:太空狗 更新时间:2023-10-29 21:34:02 25 4
gpt4 key购买 nike

我有一个异步 asp.net Controller 。该 Controller 调用一个异步方法。实际执行异步 IO 工作的方法在我的应用程序的深处。 Controller 和链中最后一个方法之间的一系列方法都用 async 修饰符标记。这是我如何设置代码的示例:

public async Task<ActionResult> Index(int[] ids)
{
List<int> listOfDataPoints = dataPointService(ids);
List<Task> dpTaskList = new List<Task>();
foreach (var x in listOfDataPoints)
{
dpTaskList.Add(C_Async(x));
}

await Task.WhenAll(dpTaskList);
return View();
}


private async Task C_Async(int id)
{
//this method executes very fast
var idTemp = paddID(id);
await D_Async(idTemp);
}

private async Task D_Async(string id)
{
//this method executes very fast
await E_Async(id);
}

private async Task E_Async(string url)
{
//this method performs the actual async IO
result = await new WebClient().DownloadStringTaskAsync(new Uri(url))
saveContent(result);
}

如您所见, Controller 异步调用 C_Async(x),然后有一个到 E_Async 的异步方法链。 controller 和 E_Async 之间有方法,都带有 async 修饰符。是否存在性能损失,因为有些方法使用异步修改器但不执行任何异步 IO 工作?

注意:这是真实代码的简化版本,在 Controller 和 E_Async 方法之间有更多的异步方法。

最佳答案

是的。有一个惩罚(虽然不是很大),如果你不需要 async 就不要。这种模式通常称为“return await”,您几乎总是可以同时删除 asyncawait。只需返回代表异步操作的已有任务:

private Task C_Async(int id)
{
// This method executes very fast
var idTemp = paddID(id);
return D_Async(idTemp);
}

private Task D_Async(string id)
{
// This method executes very fast
return E_Async(id);
}

在此特定情况下,Index 将仅等待 E_Async 返回的任务。这意味着在完成所有I/O 之后,下一行代码将直接是return View();C_AsyncD_Async 已在同步调用中运行并完成。

关于c# - 异步一直向下问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21072205/

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