4 .net c# async-await asp.net-mvc-5
我继承了一个使用MVC5和C#的大型Web应用程序.我们的一些控制器进行了几次慢速数据库调用,我想让它们异步,以便允许工作线程在等待数据库调用完成时为其他请求提供服务.我想用最少量的重构来做到这一点.说我有以下控制器
public string JsonData()
{
var a = this.servicelayer.getA();
var b = this.servicelayer.getB();
return SerializeObject(new {a, b});
}
Run Code Online (Sandbox Code Playgroud)
我通过保持服务层不变并将控制器重写为,使两个昂贵的调用a,b异步
public async Task<string> JsonData()
{
var task1 = Task<something>.Run(() => this.servicelayer.getA());
var task2 = Task<somethingelse>.Run(() => this.servicelayer.getB());
await Task.WhenAll(task1, task2);
var a = await task1;
var b = await task2;
return SerializeObject(new {a, b});
}
Run Code Online (Sandbox Code Playgroud)
上面的代码运行没有任何问题,但我无法告诉使用Visual Studio,如果工作线程现在可用于服务其他请求或如果在asp.net控制器中使用Task.Run()不执行我认为它做的.任何人都可以评论我的代码的正确性,以及它是否可以以任何方式改进?另外,我读到在控制器中使用async会产生额外的开销,应该只用于长时间运行的代码.我可以用来确定控制器是否需要异步的最低标准是什么?我知道每个用例都不同,但想知道是否有一个基线我可以用作起点.2个数据库通话?什么超过2秒返回?
指导原则是,只要有数据库I/OIe,就应该使用异步.与任何类型的I/O相比,开销微乎其微.
也就是说,阻塞线程池线程Task.Run是我称之为"假异步".这正是你什么也不希望在ASP.NET做.
相反,从你的"最低级别"代码开始,使其真正异步.例如,EF6支持异步数据库查询.然后让async代码从那里自然地增长到你的控制器.
| 归档时间: |
|
| 查看次数: |
88 次 |
| 最近记录: |