如果我们只有一系列没有独立工作的调用,MVC4 async await有什么好处?

时间:2015-11-09 12:39:15

标签: c# asp.net-mvc asp.net-mvc-4 asp.net-web-api async-await

我有一个MVC应用程序。我有这样的情况 - 我需要从多个API中提取数据。

public class MVCController : Controller
{
    // MVC controller calling WebApis to bring data.
    public async Task<ActionResult> Index()
    {
        var response1 = await client.GetAsync("webapi/WebApiController1/Method1");
        var response2 = await client.GetAsync("webapi/WebApiController2/Method2");
        var response3 = await client.GetAsync("webapi/WebApiController3/Method3");
        var response4 = await client.GetAsync("webapi/WebApiController4/Method4");
    }
}

我觉得自从每次打电话给webApi都等待,它没有给我带来任何好处。无论如何,在我们继续下一次通话之前,我们将不得不等待数据到来。例如,第一次调用必须等到它返回响应1,依此类推。如果我错了,请纠正我。

有没有办法可以并行执行这4个语句,因为其中任何一个都没有依赖关系,如果我最终可以在将模型传递给视图之前等待在底部?

如果有任何方法可以做到这一点而没有将不完整/部分数据传递给View并同时从这些Web API调用中获取数据的风险?

1 个答案:

答案 0 :(得分:4)

  

有什么方法可以并行执行这4个语句

是的,它被称为Task.WhenAll

public async Task<ActionResult> Index()
{
    var response1 = client.GetAsync("webapi/WebApiController1/Method1");
    var response2 = client.GetAsync("webapi/WebApiController2/Method2");
    var response3 = client.GetAsync("webapi/WebApiController3/Method3");
    var response4 = client.GetAsync("webapi/WebApiController4/Method4");

    await Task.WhenAll(response1, response2, response3, response4);
    // You will reach this line once all requests finish execution.
}

这样,您可以同时执行4个任务并等待它们完成。一旦完成接收请求,该方法将继续执行。