1

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

3 回答 3

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;
}
于 2012-10-29T18:10:12.303 回答
1

TPL(任务并行化库)是一种很好且简单的方式来处理像这样的简单任务。如果你有一个设置 XMLReader 的方法和一个你想在之后调用的方法,它看起来像这样:

Task XmlReaderTask = Task.Factory.StartNew(() => ReadXmlUrl(url));
XmlReaderTask.ContinueWith(x => SometMethodToDoAfter());

它也不需要您使用 C# 5.0(我确信新的 sync 和 await 关键字是处理此问题的更好方法),但 TPL 已经存在了一段时间,并且只会在较新版本的 .NET 中变得更好因此,为了快速简单地介绍一些基本线程,它绝对值得一看。

于 2012-10-29T18:35:25.420 回答
0

你需要使用Task<bool> ReadAsync()

于 2012-10-29T18:06:10.933 回答