C# 关于ASP.NET Web API-异步和等待
我的AsyncController中有以下异步方法:C# 关于ASP.NET Web API-异步和等待,c#,.net,asp.net-mvc,asp.net-web-api,async-await,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 Ta
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;
}
public异步任务GetFeeds()
{
var movies=new HttpClient().GetStringAsync(“http://netflix/api/MyMovies");
var tweets=new HttpClient().GetStringAsync(“http://twitter/api/MyTweets");
等待任务。WhenAll(电影、推特);
仪表板仪表板=新仪表板();
dash.Movies=反序列化(Movies.Result);
dash.Tweets=反序列化(Tweets.Result);
返回短跑;
}
在这个方法中,不同的调用API具有不同的返回时间。关于任务
我不能理解的是,我必须等待这两个任务的返回来更新我的客户机?因为我正在创建新的线程
想象我在一个PartialView中播放每个API的返回,我认为会得到这样的结果:
-首先,我会有我的电影列表(只需要5秒),->为我的用户显示
-然后我的tweet列表->会为我的用户显示吗
但我看到的是:
-虽然Twitter请求没有结束,但我没有在屏幕上为我的用户播放我从Netflix获得的数据
最大的问题是:任务
只用于加快处理速度
我不能根据我订购的每个API的周转时间在屏幕上播放信息
这是对我的方法的调用
public async Task<ActionResult> Index()
{
var feeds = await GetFeeds();
return View(feeds);
}
公共异步任务索引()
{
var feeds=await GetFeeds();
返回视图(提要);
}
我承认,我很困惑,或者,也许您不理解
任务的概念ASP.NET MVC的工作方式是,单个控制器操作处理单个HTTP请求,并生成单个HTTP响应。无论操作是同步的还是异步的,都是如此
换句话说(正如我在博客上解释的那样)。要将“初始结果”返回到客户端浏览器并使用其他数据更新页面(或页面的一部分),您需要使用为此设计的技术:AJAX或SignalR
有关更多信息,请参阅的“异步代码不是银弹”部分。您需要创建两个不同的异步操作。一个用于加载和显示Twitter信息(也称为长时间运行的操作)和一个用于显示Netflix信息(也称为短时间运行的操作)<代码>等待任务.WhenAll(电影、推特)
正在等待它们两个都完成,然后才显示它们。我认为您需要使用async/await对TPL进行更多的研究。很遗憾,我在这方面没有很好的资源。您可以在MSDN的第9频道上查找该模式。它们通常都很好。是的,谢谢你的澄清,我已经用AJAX请求了。我只是想我会回到用户那里,这样每个请求都会结束。我会读你的材料。非常感谢。所以说一个任务
只是一种更快的请求方式,它启动了一个新线程?@Igao:No.任务
支持异步处理。它不一定更快,也不会创建新线程。我有一个建议,您可能会发现它很有用。@Igao在处理ASP请求时使用TPL几乎完全是为了使处理请求的线程池线程能够在执行长时间运行的IO绑定操作(通常是数据库或网络调用)时花时间处理其他请求。它可以防止线程池线程在等待IO时需要坐在那里无所事事。由于机器可以支持的线程池线程数量有限制,这意味着在处理请求时增加了吞吐量。每个请求的速度都差不多。