2012-11-07 47 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