C#异步编程中仅Repository层用异步是否足够?上层是否也需异步实现?
关于项目异步方法实现范围的解答
核心结论
仅在Repository层实现异步完全不够,你需要将应用层接口、应用层实现、MVC控制器方法全链路都改为异步实现,才能真正拿到异步编程的收益。
具体原因
- 异步编程的核心价值是在IO等待(比如数据库查询、网络请求这类不需要CPU参与的操作)时,释放当前占用的线程池线程,让线程可以去处理其他请求,提升服务的吞吐能力。如果只有仓储层是异步方法,上层调用时用同步阻塞的方式获取结果(比如调用
.Result、.Wait()),等于还是把线程占住等结果,异步的收益完全浪费。 - 同步阻塞异步方法还会带来额外风险:在ASP.NET Framework环境下会大概率出现死锁问题,就算是ASP.NET Core环境没有同步上下文死锁问题,也会增加线程池的调度压力,高并发场景下甚至会导致线程池饥饿。
标准实现参考
// 应用层接口定义 public interface IUserAppService { Task<UserDto> GetUserByIdAsync(int id); Task AddUserAsync(UserCreateDto dto); } // 应用层实现 public class UserAppService : IUserAppService { private readonly IRepository<User> _userRepo; public UserAppService(IRepository<User> userRepo) { _userRepo = userRepo; } public async Task<UserDto> GetUserByIdAsync(int id) { var user = await _userRepo.GetByIdAsync(id); return user.MapTo<UserDto>(); } public async Task AddUserAsync(UserCreateDto dto) { var user = dto.MapTo<User>(); await _userRepo.AddAsync(user); } } // MVC控制器实现 public class UserController : Controller { private readonly IUserAppService _userAppService; public UserController(IUserAppService userAppService) { _userAppService = userAppService; } public async Task<IActionResult> Detail(int id) { var userDto = await _userAppService.GetUserByIdAsync(id); return View(userDto); } [HttpPost] public async Task<IActionResult> Create(UserCreateDto dto) { await _userAppService.AddUserAsync(dto); return RedirectToAction(nameof(Index)); } }
内容的提问来源于stack exchange,提问作者Subliminal Hash
相关产品推荐
相关产品推荐

