2012-04-15 90 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));