gpt4 book ai didi

c# - 如何调用嵌套的异步方法

转载 作者:太空狗 更新时间:2023-10-29 21:16:43 24 4
gpt4 key购买 nike

如果我希望两种方法都是异步的,我想知道调用嵌套异步方法的最佳方式是什么。
首先:调用方方法必须只返回Task

public async Task SaveChangesAsync()
{
await Context.SaveChangesAsync();
}
public Task UpdateAsync(List<TEntity> entities)
{
foreach (TEntity entity in entities)
{
BeforeUpdate(entity);
Context.Entry(entity).State = EntityState.Modified;
}
return SaveChangesAsync();
}


第二:调用方方法必须有一个async-await作为被调用方法

public async Task SaveChangesAsync()
{
await Context.SaveChangesAsync();
}
public async Task UpdateAsync(List<TEntity> entities)
{
foreach (TEntity entity in entities)
{
BeforeUpdate(entity);
Context.Entry(entity).State = EntityState.Modified;
}
await SaveChangesAsync();
}

最佳答案

此代码不应使用 async/await,除非这些方法中有您未显示的部分。

换句话说,这些方法应该这样写:

public Task SaveChangesAsync()
{
return Context.SaveChangesAsync();
}
public Task UpdateAsync(List<TEntity> entities)
{
foreach (TEntity entity in entities)
{
BeforeUpdate(entity);
Context.Entry(entity).State = EntityState.Modified;
}
return SaveChangesAsync();
}

这基本上是您没有显示的选项 3,根本没有 async/await 的踪迹。

这是因为代码的执行方式如下:

  1. 它将在调用线程上执行导致等待的 UpdateAsync 的所有部分,这意味着 foreach 循环将在调用线程上执行
  2. 它将执行对 SaveChangesAsync() 的调用直到它返回,仍在调用线程上
  3. SaveChangesAsync 将调用 Context.SaveChangesAsync() 直到它返回,仍在调用线程上

简而言之,这些方法的所有工作都已经在调用线程上完成了,剩下的只是Context的异步性。 SaveChangesAsync。如果你完全放弃 async/await 并简单地返回包装异步的任务,你没有牺牲任何功能,但你已经消除了编译器为你生成的所有复杂性使用 async/await 方法。

一般规则是这样的:

Unless you need to do something after the async method returns, don't use async/await

由于您的两个方法都在调用异步方法后立即结束,因此您最好只返回所涉及的任务,而不是使用 async/await

关于c# - 如何调用嵌套的异步方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37672205/

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