我使用以下代码:
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();
}
}
答案 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)
因为从例外情况来看它似乎是一个将被返回的列表。