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以您想要的方式使用变量,因为您只能在回调方法中使用异步调用的结果。

但是,您可以使用匿名方法的这种 lambda 语法将整个代码放在同一个块中(不需要单独的方法):

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 回答