我在这方面遇到了一些困难,我试图让我的第一个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()并使用返回的列表填充网格。
答案 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));