C# Net中的分层异步/等待

C# Net中的分层异步/等待,c#,.net,asynchronous,C#,.net,Asynchronous,给定一个应用程序,我想在其中执行一些异步代码,我有多层异步/等待方法有关系吗 让我们以一个web应用程序为例(使用asp.NETCore) 我们有一个控制器,可以做一些简单的事情,比如: public class MyController : Controller { private readonly MyDbContext _context; public MyController(MyDbContext context) { _context = co

给定一个应用程序,我想在其中执行一些异步代码,我有多层异步/等待方法有关系吗

让我们以一个web应用程序为例(使用asp.NETCore)

我们有一个控制器,可以做一些简单的事情,比如:

public class MyController : Controller
{
    private readonly MyDbContext _context;

    public MyController(MyDbContext context)
    {
       _context = context
    }

    public async Task<ActionResult> GetResource()
    {
       var resources = await _dbContext.Resources.ToList();
       return Ok(resources);
    }
}
公共类MyController:Controller
{
私有只读MyDbContext\u context;
公共MyController(MyDbContext上下文)
{
_上下文=上下文
}
公共异步任务GetResource()
{
var resources=await_dbContext.resources.ToList();
返回Ok(资源);
}
}
如果我添加了一个单独的抽象层(例如,我使用的是存储库模式):

公共类MyController:Controller
{
私有只读MyRepository\u repo;
公共MyController(MyRepository repo)
{
_回购=回购
}
公共异步任务GetResource()
{
var resources=await_repo.GetResources();
返回Ok(资源);
}
}
公共类MyRepository
{
私有只读MyDbContext\u context;
公共MyRepository(MyDbContext上下文)
{
_上下文=上下文;
}
公共异步任务GetResources()
{
return wait_context.Resources.ToList();
} 
}
请注意,我非常清楚我可以编写下面的代码,但我试图说明一点


    public Task<Resource> GetResources()
    {
        return _context.Resources.ToList();
    }

公共任务GetResources()
{
return_context.Resources.ToList();
}
尽管这可能是一个人为的例子,因为
waitis
在到达字节码时将被撕掉

根据我的理解,运行时将在到达
await
时创建一个线程,因此在第一个示例中创建一个线程,在第二个示例中创建两个线程

记住这一点,让异步任务尽可能靠近入口点是否更好

我有多层异步/等待方法是否重要

不,去是正常的


正确的思考方式是I/O操作自然是异步的。例如,数据库查询。因此,调用这些函数的任何东西自然也是异步的。例如,域或逻辑层。因此,调用这些函数的任何东西自然也是异步的。例如,控制器。您不需要从控制器开始“使其异步”;从I/O开始,使其异步。不执行I/O的控制器方法不应该是异步的。

它不会为等待创建线程。这需要
Task.Run()
或类似的东西。当您使用async/await correct时,使用async/await的不同层完全没有问题。“运行时在到达await时将创建一个线程”无论是谁告诉您的,还是您在哪里读到的-您应该希望将来对他们所说/所写的内容获得第二意见。您需要
\u context.Resources.tolistsync()以正确获取可等待的Task@HansKesting我更多的是询问一般模式,而不是具体的实现,但谢谢

    public Task<Resource> GetResources()
    {
        return _context.Resources.ToList();
    }