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