我正在开发一个将使用Asp Net Web Api的Asp Net MVC客户端。我必须决定如何更好地设计我的应用程序。在网上搜索了一段时间后,我发现人们建议(例如,here)使MVC操作方法异步。我还发现,使用异步操作方法的主要好处是服务器的可伸缩性,即服务器将能够提供更多请求。但有一件事,我消耗的web api具有同步动作方法,并且将在同一服务器上运行。所以我的猜测是我为我的MVC实现异步操作方法没有任何好处,因为即使我的MVC操作方法是异步的,服务器也能够从" MVC的角度来扩展"最后这些方法仍将使用同步Web Api方法,因此,服务器将不可避免地"用完它的线程池。也许我错过了某些东西,或者异步操作方法还有其他一些好处?
这是我编写的一个非常简单的示例代码,可以让您更好地理解我的问题:
这是web api控制器:
public class UsersController : ApiController
{
private readonly IUserService _userService;
public UsersController(IUserService userService)
{
_userService = userService;
}
// As you can see this method is not asynchronous
public User Get(int id)
{
return _userService.GetUserById(id);
}
// some other code
}
这是Mvc控制器,我有两种选择如何设计我的动作方法:
public class UsersController : Controller
{
// A) Make simple synchronous action methods
public ActionResult UserPageSync()
{
IUserWebServiceSync userWebServiceSync = new UserWebServiceSync();
User user = userWebServiceSync.GetUserById(1);
return View();
}
// B) Make asynchronous action methods
public async Task<ActionResult> UserPageAsync()
{
IUserWebServiceAsync userWebServiceAsync = new UserWebServiceAsync();
User user = await userWebServiceAsync.GetUserByIdAsync(1);
return View();
}
}
答案 0 :(得分:3)
我正在使用的web api具有同步操作方法,并且将在同一服务器上运行
这是一个非常不寻常的设计。但我会忽略它。
您可以这样考虑:如果MVC操作是同步的,那么每个请求将占用2个线程(一个用于MVC操作,一个用于WebAPI操作)。如果MVC操作是异步的,那么它们将为每个请求获取1个线程(MVC操作没有,一个用于WebAPI操作)。因此,对MVC操作进行异步操作仍然有明显的好处。