【问题标题】:Async await from aspnet controller down call stack从 aspnet 控制器向下调用堆栈的异步等待
【发布时间】:2020-08-30 23:26:51
【问题描述】:

鉴于aspnet控制器的以下代码sn-p,是否要求在顶层具有async/await,或者返回Task是否有效?

该场景假设存储库的底层代码中有一些使用异步的 IO(数据访问)。

控制器

public class SomeController
{
    private readonly ISomeService service;

    public SomeController(ISomeService service) => _service = service;

    public async Task<SomeResult> GetAsync()
    {
        return await _someService.GetAsync();
    }
}

服务

public class SomeService
{
    private readonly ISomeRepo repo;

    public SomeController(ISomeRepo repo) => _repo = repo;

    public async Task<SomeResult> GetAsync()
    {
        return await _repo.FirstOrDefault();
    }
}

因此在上面,async/await 是必需的吗?没有它编译得很好。 Async Fixer 建议也不需要异步等待。

这是一篇很棒的文章:

https://saebamini.com/common-async-and-await-misconceptions/#you-need-to-use-asyncawait-in-the-whole-call-stack

但这与其他信息相矛盾。

When should I use Async Controllers in ASP.NET MVC?

https://docs.microsoft.com/en-us/archive/msdn-magazine/2014/october/async-programming-introduction-to-async-await-on-asp-net

https://exceptionnotfound.net/using-async-and-await-in-asp-net-what-do-these-keywords-mean/

async/await in MVC controller's action

但问题是,在上述 aspnet 上下文中,async/await 的正确实现是什么?

请随意列出各种注意事项。

【问题讨论】:

    标签: asp.net-mvc async-await


    【解决方案1】:

    首先,请务必注意,无论哪种方式,代码都是异步的。

    也就是说,我通常建议人们在任何地方都以async/await 开头,然后只在不重要的情况下省略关键字。有几个caveats when eliding async and await,包括异常和using 语句。所以作为一般规则,如果实现真的很简单(字面意思是“转发到另一种方法”),那么请随意省略async/await;在其他任何地方,保留 async/await 关键字。它们具有最小的开销并保证非平凡方法的正确语义。

    【讨论】:

      猜你喜欢
      • 2013-03-31
      • 2012-10-14
      • 1970-01-01
      • 2021-09-30
      • 2018-03-12
      • 1970-01-01
      • 2015-04-26
      • 1970-01-01
      • 2012-12-07
      相关资源
      最近更新 更多