我有这个代码通过HttpClient获取RSS提要异步。如何从MVC控制器调用它并将数据作为List<RssFeedItem>
传递回视图?
public class RssManager
{
public async Task<List<RssFeedItem>> GetFeedItems(string url)
{
List<RssFeedItem> result = await ReadFeed(url);
return result;
}
public async Task<List<RssFeedItem>> ReadFeed(string url)
{
List<RssFeedItem> rssFeedItems = new List<RssFeedItem>();
string result;
using (var httpClient = new HttpClient())
{
var request = new HttpRequestMessage(HttpMethod.Post, url);
var response = await httpClient.SendAsync(request);
result = response.Content.ReadAsStringAsync().Result;
}
XmlTextReader rssFeed = new XmlTextReader(result.ToString());
XmlSerializer deserializer = new XmlSerializer(typeof(List<RssFeedItem>));
rssFeedItems = (List<RssFeedItem>)deserializer.Deserialize(rssFeed);
rssFeed.Close();
rssFeed.Dispose();
return rssFeedItems;
}
}
答案 0 :(得分:3)
如何从MVC控制器调用此数据并将数据作为
List<RssFeedItem>
传递回视图?
通常,您在另一个异步方法中执行此操作,并await
结果。例如:
public async Task<ActionResult> Foo(...)
{
// ...
var list = await manager.ReadFeed(url);
// ... maybe do something with the list
return View(list);
}
通常,如果您不需要在同步和异步代码之间切换,则异步更容易处理。在这里,当ReadFeed
返回的任务完成时,编译器将为你的方法的其余部分注册适当的回调,它将创建一个Task<ActionResult>
,当你自己完成时它将自己完成提供了观点。 ASP.NET基础架构将处理剩下的工作。
答案 1 :(得分:1)
等待任务。这样:
var result = GetFeedItems(someUrl);
会在变量Task<List<RssFeedItem>>
中添加result
。但是你不想要任务,你想要任务的结果。所以你会这样做:
var result = await GetFeedItems(someUrl);
这会将List<RssFeedItem>
放入变量result
。
在这种情况下,您的控制器方法也应该是async
,遵循&#34; async一直向下&#34;的最佳做法。基本上,您的代码将使用awaits
来同步等待结果,并且使用代码(在这种情况下是托管Web服务器)将使用顶级异步调用来在代码执行时释放资源。