我使用XmlTextReader阅读器在线获取一些数据。
在这个阶段,应用程序就像被阻塞了一样。
我试过使用BeginInvoke,但它没有很大的帮助。
或者我可能需要实现某种类型的已完成操作……
我不知道。
有没有办法解决这个问题?
谢谢!
var searchUrl = "http://weather.service.msn.com/find.aspx?outputview=search&src=vista&weasearchstr=" + query;
// Application is blocked here
var reader = new XmlTextReader(searchUrl);
while (reader.Read())
{发布于 2012-10-30 02:10:12
如果您使用的是c# 5.0,则async/await可在此处提供帮助
public async void SOQuestion(string query)
{
var searchUrl = "http://weather.service.msn.com/find.aspx?outputview=search&src=vista&weasearchstr=" + query;
WebClient wc = new WebClient();
string xml = await wc.DownloadStringTaskAsync(searchUrl);
var xDoc = XDocument.Parse(xml);
var results = xDoc.Descendants("weather")
.Select(w => new
{
Location = w.Attribute("weatherlocationname").Value,
Temp = w.Element("current").Attribute("temperature").Value,
SkyText = w.Element("current").Attribute("skytext").Value,
})
.ToList();
dataGridView1.DataSource = results;
}发布于 2012-10-30 02:35:25
TPL (Task Parallelization Library,任务并行化库)是一种很好的、简单的方法来处理像这样的简单任务。如果您有一个用于设置XMLReader的方法,并且有一个您想要在之后调用的方法,它将如下所示:
Task XmlReaderTask = Task.Factory.StartNew(() => ReadXmlUrl(url));
XmlReaderTask.ContinueWith(x => SometMethodToDoAfter());它也不需要你使用TPL5.0(我确信新的sync和await关键字是处理这个问题的更好的方法),但是C#已经存在一段时间了,并且只在.NET的新版本中变得更好,所以为了快速而简单地介绍一些基本的线程,绝对值得一看。
发布于 2012-10-30 02:06:11
您需要使用Task<bool> ReadAsync()
https://stackoverflow.com/questions/13127196
复制相似问题