C# Net中的分层异步/等待
给定一个应用程序,我想在其中执行一些异步代码,我有多层异步/等待方法有关系吗 让我们以一个web应用程序为例(使用asp.NETCore) 我们有一个控制器,可以做一些简单的事情,比如: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
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();
}