2012-04-15 94 views
0

我在這方面遇到了一些困難,我試圖讓我的第一個WP7應用程序出來。 我有一個方法,從網站上下載HTML並將其正則表達,但問題是,當我第一次點擊按鈕時,沒有任何反應,第二次嘗試,它完美地填充網格,當我調試我時在該方法甚至開始之前,已經正確指定了帶有HTML的字符串。所以,問題是,等待異步方法完成的最簡單方法是什麼? 我已經搜索了有關CTP異步和其他一些方法,但我無法設法使其工作。 這裏的是代碼在WP7上等待異步完成的最佳方式

public static void client_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e) 
    { 
     doc = e.Result; 
    } 

    public static List<Row> Search(string number) 
    { 
     WebClient wClient = new WebClient(); 

     sNumber = number; 
     int i = 0; 
     DateTime datetime; 

     wClient.DownloadStringAsync(new Uri(sURL + sNumber)); 
     wClient.DownloadStringCompleted += new DownloadStringCompletedEventHandler(client_DownloadStringCompleted); 
       /*More code*/ 
    } 

按鈕調用該方法搜索(),並使用列表中返回,以填補電網。

回答

2

wClient.DownloadStringAsync(new Uri(sURL + sNumber));方法在執行該方法中的所有代碼後執行。

1)首先doc爲空

2)然後調用wClient.DownloadStringAsync(new Uri(sURL + sNumber));但不執行!

3)然後返回文檔(這仍然是空)

4)之後,這一切,wClient.DownloadStringAsync(new Uri(sURL + sNumber));被執行,doc被填滿。

這就是爲什麼當你按下搜索按鈕的第二次,網格填​​充完美

注:在調用異步方法之前,您必須註冊DownloadStringCompletedEventHandler。而且你只需要在構造函數中註冊一次這個事件處理程序,因爲每次執行這個方法都要添加一個事件處理程序。所以,如果你按下搜索按鈕5次,網格填​​充5次,雖然你沒有注意到

一個解決辦法是:

這裏的是代碼

public static void client_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e) 
    { 
     if (e.Result != null) 
     { 
      //populate grid view 
     } 
    } 

    public static void Search(string number) 
    { 
     WebClient wClient = new WebClient(); 

     sNumber = number; 
     int i = 0; 
     DateTime datetime; 

     wClient.DownloadStringCompleted += new DownloadStringCompletedEventHandler(client_DownloadStringCompleted); //this should be added in the constructor, so it would only be added once 
     wClient.DownloadStringAsync(new Uri(sURL + sNumber)); 
    } 
+2

'DownloadStringAsync'可能會在'DownloadStringCompleted'設置之前完成。在**調用異步操作之前,您應該始終**設置事件處理程序**。 – 2012-04-15 18:56:53

+0

對不起,我的錯。你是對的@克勞斯約根森 – user1135357 2012-04-16 18:09:26

1

有沒有在你的代碼,至少有兩個問題:你需要調用DownloadStringAsync之前訂閱DownloadStringCompleted- 否則有機會,你訂閱之前下載完成。此外,由於您的完成方法非常短,您可以使用lambda進行內聯操作。

其次你的方法是異步 - 它將回報,因爲網絡呼叫List<Row>異步執行。你將不得不在你的完成方法中填充你的網格,並使你的方法返回void。這就是爲什麼它第二次「運作」 - 返回第一個呼叫的現在完成結果。

wClient.DownloadFileCompleted += (sender, e) => 
{ 
    //you should also do error checking here 
    //populate grid 
}; 
wClient.DownloadStringAsync(new Uri(sURL + sNumber));