0

これは(別の)初心者の質問になる可能性がありますが、これを行う方法がわかりません。

静的メソッドを参照するプライベート メソッド内にコードがあります。

using (WebClient wc = new WebClient())
{
    wc.DownloadStringCompleted += new DownloadStringCompletedEventHandler(wc_DownloadStringCompleted);
    wc.DownloadStringAsync(new Uri(requestUri));
}

それが参照する静的メソッド:

static void wc_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e)
{

    var xmlElm = XElement.Parse(e.Result);

    var status = (from elm in xmlElm.Descendants()
                  where elm.Name == "status"
                  select elm).FirstOrDefault();
    if (status.Value.ToLower() == "ok")
    {
        var res = (from elm in xmlElm.Descendants()
                   where elm.Name == "formatted_address"
                   select elm).FirstOrDefault();
        formatted = res.Value;

    }          
}

ここで、WebClient のコンテンツを置き換えるために、静的メソッドのコンテンツが必要です。お気に入り:

using (WebClient wc = new WebClient())
{
    var xmlElm = XElement.Parse(e.Result);

    var status = (from elm in xmlElm.Descendants()
                  where elm.Name == "status"
                  select elm).FirstOrDefault();
    if (status.Value.ToLower() == "ok")
    {
        var res = (from elm in xmlElm.Descendants()
                   where elm.Name == "formatted_address"
                   select elm).FirstOrDefault();
        formatted = res.Value;

    }
}

「e」がどこから来たのかわからないので、それを機能させる方法がわかりません。

4

1 に答える 1

1

非同期呼び出しのポイントが欠落しているようです。これの要点は、非同期メソッドの実行を開始し、メソッドをすべて忘れてコードを続行し、その応答を処理するためのコールバックメソッドのみを残すことです。

短く簡単にするformattedために、非同期呼び出しの結果はコールバックメソッドでのみ使用できるため、変数を希望どおりに使用する方法はありません。

ただし、匿名メソッドにこのようなラムダ構文を使用すると、コード全体を同じブロック内に含めることができます(個別のメソッドは必要ありません)。

myLabel.Text = "loading...<br />";
using (WebClient wc = new WebClient())
{
    wc.DownloadStringCompleted += new DownloadStringCompletedEventHandler((sender2, e2) =>
    {
        var xmlElm = XElement.Parse(e2.Result);
        var status = (from elm in xmlElm.Descendants()
            where elm.Name == "status"
            select elm).FirstOrDefault();
        if (status.Value.ToLower() == "ok")
        {
            var res = (from elm in xmlElm.Descendants()
                where elm.Name == "formatted_address"
                select elm).FirstOrDefault();
            myLabel.Text = res.Value;
        }
        else
        {
             myLabel.Text = "Bad status: " + status.Value;
        }
    });
    wc.DownloadStringAsync(new Uri(requestUri));
}

たとえば、準備ができたら、ページのラベルに結果を入力します。

ロードが完了するまで待ちたい場合は、通常のDownloadString方法を使用してください。

string formatted = "";
using (WebClient wc = new WebClient())
{
    string raw = wc.DownloadString(new Uri(requestUri));
    var xmlElm = XElement.Parse(raw);
    var status = (from elm in xmlElm.Descendants()
        where elm.Name == "status"
        select elm).FirstOrDefault();
    if (status.Value.ToLower() == "ok")
    {
        var res = (from elm in xmlElm.Descendants()
            where elm.Name == "formatted_address"
            select elm).FirstOrDefault();
        formatted = res.Value;
    }
    else
    {
         formatted = "Bad status: " + status.Value;
    }
}

//use the variable as you wish...
于 2012-11-07T11:50:58.463 に答える