在WP7上等待异步完成的最佳方法

时间:2012-04-15 15:00:58

标签: c# windows-phone-7

我在这方面遇到了一些困难,我试图让我的第一个WP7应用程序出局。 我有一个方法从网站下载html和正则表达式,但问题是,当我第一次点击按钮,没有任何反应,在第二次尝试,它完全填充网格,当我调试时,我看到在方法开始之前,已经正确分配了带有HTML的字符串。那么,问题是,等待异步方法完成的最简单方法是什么? 我已经搜索过CTP异步和其他一些方法,但我无法设法让它工作。 这是代码

   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*/
     }

该按钮调用方法Search()并使用返回的列表填充网格。

2 个答案:

答案 0 :(得分:2)

执行该方法中的所有代码后执行wClient.DownloadStringAsync(new Uri(sURL + sNumber));方法。

1)首先doc为空

2)然后你打电话给wClient.DownloadStringAsync(new Uri(sURL + sNumber));但不执行!!

3)然后你返回doc(仍为null)

4)完成所有这些后,执行wClient.DownloadStringAsync(new Uri(sURL + sNumber));并填充doc

这就是为什么当您第二次按下“搜索”按钮时,网格将被完美填充

N.B。在调用异步方法之前,必须注册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));
     }

答案 1 :(得分:1)

您的代码中至少存在两个问题:您需要在调用DownloadStringCompleted之前订阅DownloadStringAsync - 否则在您订阅之前可能会完成下载。此外,由于您的完成方法非常短,您可以使用lambda进行内联。

其次,您的方法异步 - 由于Web调用异步执行,因此将返回List<Row>。您必须在完成方法中填充网格并使方法返回void。这就是它第二次“工作”的原因 - 返回第一次调用的现在完成的结果。

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