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(Task Parallelization Library)は、このような単純なタスクをスレッド化するための優れた簡単な方法です。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 に答える