我接手了一个使用MVC5和C#的大型web应用程序。我们的一些控制器会进行多个缓慢的数据库调用,我想将它们异步化,以便在等待数据库调用完成时允许工作线程为其他请求提供服务。我希望尽可能少地进行重构。假设我有以下控制器:
public string JsonData()
{
var a = this.servicelayer.getA();
var b = this.servicelayer.getB();
return SerializeObject(new {a, b});
}
我已将两个昂贵的调用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});
}
上述代码没有任何问题,但是我无法使用Visual Studio来确定工作线程是否现在可用于处理其他请求,或者在asp.net控制器中使用Task.Run()是否不像我想象的那样。有人可以评论一下我的代码是否正确,并且如果可以改进的话应该如何改进?此外,我读到在控制器中使用async会增加额外开销,应仅用于长时间运行的代码。我可以使用哪些最低标准来决定控制器是否需要async呢?我明白每个使用场景都不同,但想知道是否有一个基准线可以作为起点。2个数据库调用?超过2秒返回?