关于ASP.NET Web API - 异步和等待

Igo*_*gor 2 .net c# asp.net-mvc async-await asp.net-web-api

我的AsyncController中有以下异步方法:

public async Task<Dashboard> GetFeeds()
{
    var movies = new HttpClient().GetStringAsync("http://netflix/api/MyMovies");
    var tweets = new HttpClient().GetStringAsync("http://twitter/api/MyTweets");

    await Task.WhenAll(movies, tweets);

    Dashboard dash = new Dashboard();
    dash.Movies = Deserialize<Movies >(movies.Result);
    dash.Tweets = Deserialize<Tweets >(tweets.Result);

    return dash; 
}
Run Code Online (Sandbox Code Playgroud)

在这个方法中做不同的调用API,一个具有彼此不同的返回时间.我无法理解的Task<>是因为我必须等待两人的回归才能更新我的客户?因为我正在创造新的线程.

在此输入图像描述

想象一下我在PartialView中播放每个API的返回,我认为结果会得到:

- 首先我会有我的电影列表(它只需要5s), - >显示给我的用户

- 然后我的推文列表 - >显示给我的用户

但我看到的是:

- 虽然Twitter请求没有结束,但我没有在屏幕上为我的用户播放我从Netflix获得的数据.

最大的问题是:A Task<>仅用于加快处理速度吗?

我根据我订购的每个API的周转时间无法在屏幕上播放信息?

这是对我的方法的调用

public async Task<ActionResult> Index()
{
    var feeds = await GetFeeds();

    return View(feeds);
}
Run Code Online (Sandbox Code Playgroud)

我承认,我很困惑,或者,也许你不明白这个概念Task<>.

Ste*_*ary 8

ASP.NET MVC的工作方式是单个控制器操作处理单个HTTP请求,并生成单个HTTP响应.无论动作是同步还是异步,都是如此.

换句话说(正如我在我的博客上解释的那样),async不会改变HTTP协议.要将"初始结果"返回给客户端浏览器并使用其他数据更新页面(或页面的一部分),您需要使用专为此设计的技术:AJAX或SignalR.

有关详细信息,请参阅我在异步ASP.NET上的MSDN文章中的"异步代码不是银弹"部分.

  • @Igao:没有.`Task`启用*异步*处理.它不一定更快,也不会创建新线程.我有一个[`async`介绍博客文章](http://blog.stephencleary.com/2012/02/async-and-await.html)你可能会觉得有帮助. (2认同)
  • @Igao处理ASP请求时使用TPL几乎完全是这样,处理请求的线程池线程能够花时间处理其他请求,无论何时执行长时间运行的IO绑定操作(通常是数据库或网络调用) .它可以防止线程池线程在等待IO时无需坐在那里并且什么也不做.由于机器可以支持的线程池线程数有限制,这意味着在处理请求时增加了吞吐量.每个*个人*以大约相同的速度请求. (2认同)