2012-11-07 16 views
0

这可能是(nother)noob问题,但我不知道如何做到这一点。C#如何在主空间内传递参考空白

我有一段代码在一个私有方法中引用一个静态方法。

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; 

    }   
} 

现在我需要的静态方法的内容替换Web客户端的内容。 像:

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”从起源,我不知道如何得到它的工作。

+0

你想要的“格式化”,以取代“e.Result”? –

+0

不,“格式化”是最终结果。 “e.Result”是需要的一条信息才能达到最终结果。 – Felix

回答

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... 
+0

我明白你的意思了,我开始明白了。在继续之前,是否有办法等待结果准备就绪? – Felix

+0

@Felix当然,看我的编辑。 –

+0

太好了!它很好用,谢谢!一直在学习;) – Felix