【问题标题】:About ASP.NET Web API - Async and Await关于 ASP.NET Web API - 异步和等待
【发布时间】:2015-02-03 20:52:55
【问题描述】:

我的 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; 
}

在这个方法中做不同的调用API,一个返回时间不同。我不能理解Task&lt;&gt; 是因为我必须等待两者的返回才能更新我的客户?因为我正在创建新线程。

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

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

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

但我看到的是:

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

最大的问题是:Task&lt;&gt; 仅用于更快地完成处理?

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

这是对我的方法的调用

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

    return View(feeds);
}

我承认,我很困惑,或者,你可能没有理解Task&lt;&gt;的概念。

【问题讨论】:

  • 您需要创建两个不同的异步操作。一种用于加载和显示 Twitter 信息(也就是运行时间较长的操作),另一种用于显示 Netflix 信息(也就是较短的操作)。 await Task.WhenAll(movies, tweets); 在显示它们之前正在等待它们完成。我认为您需要对带有 async/await 的 TPL 进行更多研究。遗憾的是,我没有很好的资源。您可以在 MSDN 的第 9 频道上查找该模式。它们通常非常好。

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


【解决方案1】:

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

换句话说(正如我在博客中解释的那样),async doesn't change the HTTP protocol。要向客户端浏览器返回“初始结果”并使用其他数据更新页面(或页面的一部分),您需要使用为此设计的技术:AJAX 或 SignalR。

有关详细信息,请参阅my MSDN article on async ASP.NET 的“异步代码不是灵丹妙药”部分。

【讨论】:

  • 是的,感谢您的澄清,我已经使用 AJAX 请求获得了它。我只是以为我会返回给用户,以便每次请求结束。我会读你的材料。谢谢!
  • 所以说Task&lt;&gt;只是一种更快的请求方式,它启动了一个新线程?
  • @Igao: 否。Task 启用异步处理。它不一定更快,也不会创建新线程。我有一个 async intro blog post 你可能会觉得有帮助。
  • @Igao 在处理 ASP 请求时几乎完全使用 TPL,以便处理请求的线程池线程能够在您执行长时间运行的 IO 绑定时花时间处理其他请求操作(通常是数据库或网络调用)。它可以防止线程池线程在等待 IO 时需要坐在那里什么都不做。由于机器可以支持多少线程池线程是有限制的,这意味着在处理请求时增加了吞吐量。每个单个请求的速度大致相同。
猜你喜欢
  • 2021-06-28
  • 1970-01-01
  • 2021-05-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-14
  • 1970-01-01
  • 2021-09-19
相关资源
最近更新 更多