如何从异步任务<list <obj>&gt;获取List <obj>

时间:2015-05-18 17:52:04

标签: c# asp.net-mvc asynchronous

我有这个代码通过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;
    }
}

2 个答案:

答案 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服务器)将使用顶级异步调用来在代码执行时释放资源。