XmlTextReader阻止应用程序

时间:2012-10-29 18:03:20

标签: c# .net wpf

我使用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())
{

3 个答案:

答案 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()