我使用XmlTextReader
读者在线获取一些数据。
在此阶段,应用程序就像被阻止一样。
我曾尝试使用BeginInvoke
,但它没有多大帮助。
或者我可能需要实施一些COMPLETED动作....
我不知道......
有任何线索如何解决?
谢谢!
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())
{
答案 0 :(得分:2)
如果您使用的是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;
}
答案 1 :(得分:1)
TPL(任务并行化库)是一种很简单的方法来处理像这样的简单任务。如果你有一个设置XMLReader的方法和一个你想要调用的方法,它将看起来像这样:
Task XmlReaderTask = Task.Factory.StartNew(() => ReadXmlUrl(url));
XmlReaderTask.ContinueWith(x => SometMethodToDoAfter());
它也不要求你使用C#5.0(我确定新的同步和等待关键字是一种更好的处理方式)但是TPL已经存在了一段时间,并且只是在新版本中变得更好因此,为了快速简单地介绍一些基本的线程,它绝对值得一看。
答案 2 :(得分:0)
您需要使用Task<bool> ReadAsync()