0

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

   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() 并使用返回的列表来填充网格。

4

2 回答 2

2

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

1) 起初doc为空

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

3)然后你返回 doc (它仍然是空的)

4)在这一切之后,wClient.DownloadStringAsync(new Uri(sURL + sNumber));被执行并被doc填充。

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

注意,您必须DownloadStringCompletedEventHandler在调用异步方法之前注册。而且您只需注册一次该事件处理程序,即在构造函数中,因为每次执行该方法时您都添加了一个事件处理程序。因此,如果您按 Search 按钮 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));
     }
于 2012-04-15T15:12:47.623 回答
1

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

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

wClient.DownloadFileCompleted += (sender, e) =>
{
    //you should also do error checking here
    //populate grid 
};
wClient.DownloadStringAsync(new Uri(sURL + sNumber));
于 2012-04-15T15:10:12.567 回答