Asp.net mvc MVC中的控制器可以对数据库进行异步调用吗?

Asp.net mvc MVC中的控制器可以对数据库进行异步调用吗?,asp.net-mvc,Asp.net Mvc,我正在为我的项目添加一个业务数据层,目前我正在将其连接到一个MVC应用程序。我将有一个响应视图的控制器和用于WebApi的控制器,这样我就可以进行异步AngularJS调用 我是否需要实现对数据的异步和同步调用,还是可以使用经典MVC控制器的异步函数?(我不确定视图和控制器之间的通信是如何实现的,所以我担心我可能会导致一些问题,因为默认情况下,它正在对数据库进行同步调用) 或者我可以为经典的MVC控制器使用异步函数吗 你当然可以。至少在最新版本的MVC中(我记不起何时添加了支持) 您不需要做任何

我正在为我的项目添加一个业务数据层,目前我正在将其连接到一个MVC应用程序。我将有一个响应视图的控制器和用于WebApi的控制器,这样我就可以进行异步AngularJS调用

我是否需要实现对数据的异步和同步调用,还是可以使用经典MVC控制器的异步函数?(我不确定视图和控制器之间的通信是如何实现的,所以我担心我可能会导致一些问题,因为默认情况下,它正在对数据库进行同步调用)

或者我可以为经典的MVC控制器使用异步函数吗

你当然可以。至少在最新版本的MVC中(我记不起何时添加了支持)

您不需要做任何特殊的事情,只需将您的操作标记为
async
并返回
Task

您可以在操作中自由混合使用阻塞和异步方法

例如

公共异步任务详细信息(id){
var res=await db.Entities.FindAsync(id);
如果(res==null){
返回HttpNotFound();
}
返回视图(res);
}
或者我可以为经典的MVC控制器使用异步函数吗

你当然可以。至少在最新版本的MVC中(我记不起何时添加了支持)

您不需要做任何特殊的事情,只需将您的操作标记为
async
并返回
Task

您可以在操作中自由混合使用阻塞和异步方法

例如

公共异步任务详细信息(id){
var res=await db.Entities.FindAsync(id);
如果(res==null){
返回HttpNotFound();
}
返回视图(res);
}
或者我可以为经典的MVC控制器使用异步函数吗

你当然可以。至少在最新版本的MVC中(我记不起何时添加了支持)

您不需要做任何特殊的事情,只需将您的操作标记为
async
并返回
Task

您可以在操作中自由混合使用阻塞和异步方法

例如

公共异步任务详细信息(id){
var res=await db.Entities.FindAsync(id);
如果(res==null){
返回HttpNotFound();
}
返回视图(res);
}
或者我可以为经典的MVC控制器使用异步函数吗

你当然可以。至少在最新版本的MVC中(我记不起何时添加了支持)

您不需要做任何特殊的事情,只需将您的操作标记为
async
并返回
Task

您可以在操作中自由混合使用阻塞和异步方法

例如

公共异步任务详细信息(id){
var res=await db.Entities.FindAsync(id);
如果(res==null){
返回HttpNotFound();
}
返回视图(res);
}

您可以简单地将同步代码包装在
Task.Run()
中,除非您更喜欢使用实体框架的内置异步逻辑。因此,如果不使用EF builtin async?利用任务并行库(TPL,
Task
Task
的底层实现,等等),唯一的问题可能是性能稍差增加一些开销(所有这些状态机都用于跟踪完成情况)。它的好处不是加快单个调用的速度,而是允许工作线程执行其他操作。如果没有TPL,每个阻塞调用将占用一个线程,该线程可以在资源(数据库,…)尚未返回其数据时服务另一个请求。因此,与需要1000个线程的1000个并发请求相比,您使用的线程要少得多,从而减少了总体机器负载。您可以简单地将同步代码包装在
Task.Run()
中,除非您喜欢使用,实体框架的内置异步逻辑。因此,如果不使用EF builtin async,唯一的问题可能是性能稍差。利用任务并行库(TPL,任务的底层实现<代码>任务<代码>,<代码>任务<代码>,等等)会增加一些开销(所有这些状态机都用于跟踪完成情况)。它的好处不是加快单个调用的速度,而是允许工作线程执行其他操作。如果没有TPL,每个阻塞调用将占用一个线程,该线程可以在资源(数据库,…)尚未返回其数据时服务另一个请求。因此,与需要1000个线程的1000个并发请求相比,您使用的线程要少得多,从而减少了总体机器负载。您可以简单地将同步代码包装在
Task.Run()
中,除非您喜欢使用,实体框架的内置异步逻辑。因此,如果不使用EF builtin async,唯一的问题可能是性能稍差。利用任务并行库(TPL,任务的底层实现<代码>任务<代码>,<代码>任务<代码>,等等)会增加一些开销(所有这些状态机都用于跟踪完成情况)。它的好处不是加快单个调用的速度,而是允许工作线程执行其他操作。如果没有TPL,每个阻塞调用将占用一个线程,该线程可以在资源(数据库,…)尚未返回其数据时服务另一个请求。因此,与需要1000个线程的1000个并发请求相比,您使用的线程要少得多,从而减少了总体机器负载。您可以简单地将同步代码包装在
Task.Run()
中,除非您喜欢使用,实体框架的内置异步逻辑。因此,如果不使用EF builtin async,唯一的问题可能是性能稍差。利用任务并行库(TPL,任务的底层实现<代码>任务<代码>,<代码>任务<代码>,等等)会增加一些开销(所有这些状态机都用于跟踪完成情况)。它的好处不是加快单个调用的速度,而是允许工作线程执行其他操作。如果没有TPL,每个阻塞调用将占用一个线程,该线程可以在资源(数据库,…)尚未返回其数据时服务另一个请求。因此,与需要1000个线程的1000个并发请求相比,您使用的线程要少得多
public async Task<ActionResult> Details(id) {

  var res = await db.Entities.FindAsync(id);
  if (res == null) {
    return HttpNotFound();
  }

  return View(res);
}