foreach声明给出错误

时间:2013-11-01 19:01:43

标签: c# visual-studio-2012 foreach rss

我使用以下代码:

private string covertRss(string url)
    {
        var s = RssReader.Read(url);
        StringBuilder sb = new StringBuilder();
        foreach (RssNews rs in s)   //ERROR LINE
        {
            sb.AppendLine(rs.Title);
            sb.AppendLine(rs.PublicationDate);
            sb.AppendLine(rs.Description);
        }

        return sb.ToString();
    }

我收到错误:

  

错误1 foreach语句无法对类型为'System.Threading.Tasks.Task(System.Collections.Generic.List(Cricket.MainPage.RssNews))'的变量进行操作,因为'System.Threading.Tasks.Task(System。 Collections.Generic.List(Cricket.MainPage.RssNews))'不包含'GetEnumerator'的公共定义

RssNews课程是:

public class RssNews
    {
        public string Title;
        public string PublicationDate;
        public string Description;

    }

我应该添加什么代码,以便删除错误并且不会对代码的目的进行编译? 提前谢谢!

RssReader.Read()的代码

public class RssReader
    {
        public static async System.Threading.Tasks.Task<List<RssNews>> Read(string url)
        {
            HttpClient httpClient = new HttpClient();

            string result = await httpClient.GetStringAsync(url); 

            XDocument document = XDocument.Parse(result);

            return (from descendant in document.Descendants("item")
                    select new RssNews()
                    {
                        Description = descendant.Element("description").Value,
                        Title = descendant.Element("title").Value,
                        PublicationDate = descendant.Element("pubDate").Value
                    }).ToList();
        }
    }

3 个答案:

答案 0 :(得分:7)

您需要使用await

foreach (RssNews rs in await s)

或:

var s = await RssReader.Read(url);

使用Result;如果你这样做,你可以轻松地cause a deadlock在我的博客上描述。

作为旁注,我建议您阅读并遵循Task-based Asynchronous Pattern documentation中的指南。如果你这样做,你会发现你的方法Read应该被命名为ReadAsync,这会为你的调用代码提供一个强有力的暗示,它需要使用await

var s = await RssReader.ReadAsync(url);

答案 1 :(得分:2)

我认为您错过了await声明。

s的类型为Task<List<RssNews>>

你要么需要这个

var s = await RssReader.Read(url);

var s = RssReader.Read(url).Result;//this is blocking call

当然,当您使用await时,您还需要标记方法async

您的下载方式

private async Task<string> covertRss(string url)
{
    var s = await RssReader.Read(url);
    StringBuilder sb = new StringBuilder();
    foreach (RssNews rs in s)   //ERROR LINE
    {
        sb.AppendLine(rs.Title);
        sb.AppendLine(rs.PublicationDate);
        sb.AppendLine(rs.Description);
    }

    return sb.ToString();
}

答案 2 :(得分:0)

你在循环中使用任务本身。您需要使用Result属性

foreach (RssNews rs in s.Result)

因为从例外情况来看它似乎是一个将被返回的列表。