Web API 异步方法 AngularJS

Web API async method with AngularJS

我刚开始使用 AngularJSMVC 5 我一直在考虑使用 Web APIAngularJS 因为它似乎是一个很好的解决方案将数据加载到您的客户端模型中。

但是我注意到相当多的指南使用 returns Task<Model> 的异步操作,我不明白这比使用标准 Web API 操作有什么好处(示例:http://monox.mono-software.com/blog/post/Mono/233/Async-upload-using-angular-file-upload-directive-and-net-WebAPI-service/ and http://www.asp.net/web-api/overview/getting-started-with-aspnet-web-api/build-a-single-page-application-%28spa%29-with-aspnet-web-api-and-angularjs)。

由于这些对 Web API 的调用无论如何都是异步的,所以我不知道为什么我们需要使这些方法调用异步。只使用标准 Web API 调用不是更好吗?

我不知道 Whosebug 是否适合做这个,但我希望得到一个解释,说明为什么要这样调用。

async-await 在服务器上的好处是可伸缩性和性能。当您用异步(非阻塞)操作替换同步(阻塞)操作时,您释放了之前阻塞等待的线程,您可以使用这些线程并发处理其他请求。

async-await 使您能够用更少的资源做更多的事情。

假设我们有这个同步方法:

public void Process()
{
    for (int i = 0; i < 1000; i++)
    {
        Math.Sqrt(i);
    }

    Thread.Sleep(3000); // sync I/O
}

通过async:

public async Task ProcessAsync()
{
    for (int i = 0; i < 1000; i++)
    {
        Math.Sqrt(i);
    }

    await Task.Delay(3000) // async I/O
}

我们可以使用单个线程来处理同一方法的多个请求,因为处理请求的线程在您await异步操作时被释放。

再举一个例子:

假设有 2 个请求,其中一个请求等待数据库 2 秒,另一个请求应用程序逻辑 2 秒。

没有异步,在请求的第 1 秒,有 2 个线程正在使用。

使用异步(一直执行到数据库调用),在请求 1 秒后,1 个线程正在使用,处理应用程序逻辑。另一个请求处于等待状态(未使用线程)。

两个请求都需要 2 秒,但在异步场景中,活动线程的数量会在某些请求持续时间内减少

服务器端的异步等待不是 enable/enhance 异步 XMLHttpRequests(AJAX 调用)。它是为了启用 await 关键字和处理 return 任务在较低级别的框架代码和您的服务器端代码中,如果您选择实现任何一个。想到这个例子:

底层 Web API 的控制器调度程序启动控制器以响应请求,并告诉它去执行一个操作。然后它需要查看响应并根据结果(错误等)采取行动。如果它同步执行该分派,则线程会被分派器阻塞,等待操作完成,而实际上并非如此。在异步上下文中,该调度程序可以等待来自控制器的响应,并且线程被释放用于其他任务 运行。当原始控制器的操作完成后,任何空闲线程都可以从第一个线程停止的地方开始并处理其余的调度。