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

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

我的 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<>是因为我要等两人回来更新我的客户端?因为我正在创建新线程。

enter image description here

假设我在一个PartialView中播放各个API的返回,我认为会得到的结果:

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

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

但我看到的是:

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

最大的问题是:A Task<>仅用于更快地完成处理?

我不能按照我订购的每个API的周转时间播放屏幕上的信息吗?

这是对我的方法的调用

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

    return View(feeds);
}

我承认,我很困惑,或者,你可能没有理解Task<>的概念。 .

最佳答案

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

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

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

关于c# - 关于 ASP.NET Web API - 异步和等待,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27320072/

相关文章:

c# - 更新 ASP.NET One Core 中的声明值

jquery - jquery block 中关闭编译

C# 锯齿状数组到列表列表

c# - 在 WindowsFormsHost 上使用 RenderTargetBitmap

.net - 如何从转储文件确定 GC 工作站与服务器模式

c# - 如何编译这个扩展方法?

javascript - 什么可能导致 ViewData ["x"].ToString 不起作用?

c# - 如何将一个 IEnumerable 异步转换为另一个 IEnumerable,就像 LINQ 的 Select() 一样,但对每个转换后的项使用 wait ?

c# - 转换导致不同的 GetType

c# - 如何使用 C# 将 powershell 脚本编码为 base64 UTF16-LE 字符串