我正在尝试在应用程序启用之前在spash页面上自动登录用户,但是下面的代码可以正常工作。我把断点放进去,似乎从未调用过loginDone。从按钮启动时,非常相似的代码工作正常。 Application_Launching方法有什么特别之处,这意味着它无法下载字符串吗?可能不是所有的东西都已经初始化所以它不会工作但是我会期望它出错。
private void Application_Launching(object sender, LaunchingEventArgs e)
{
done = false;
IsolatedStorageSettings appSettings = IsolatedStorageSettings.ApplicationSettings;
appSettings.Remove("sid");
if (appSettings.Contains("username") && appSettings.Contains("password")) {
WebClient wc = new WebClient();
wc.DownloadStringCompleted += loginDone;
wc.DownloadStringAsync(InkBunnyUrls.Login(appSettings["username"].ToString(), appSettings["password"].ToString()));
for (int i = 0; (i < 60 && !done); i++) {
Thread.Sleep(TimeSpan.FromSeconds(1));
}
}
}
private void loginDone(object sender, DownloadStringCompletedEventArgs e)
{
IsolatedStorageSettings appSettings = IsolatedStorageSettings.ApplicationSettings;
XDocument loginxml = XDocument.Parse(e.Result);
var sid = (loginxml.Descendants("response").Elements("sid")).FirstOrDefault();
if (sid == null || sid.Value.Length < 1) {
appSettings.Add("sid", sid.Value);
}
done = true;
}
答案 0 :(得分:3)
WebClient
并不像人们期望的那样异步 - 它在UI线程上执行各种操作,包括DownloadStringCompleted
处理。因此,无论它需要做什么,都将等待获取UI线程 - 您已经使用for
循环阻止了一分钟。
支持这样的UI线程通常是一个非常糟糕的主意。我会用启动画面显示&#34;下载文件...&#34;让UI线程空闲并且能够处理诸如完成Web请求之类的事件 - 当文件下载完成后然后,您可以移动到真实的&#34;真实的&#34;第一个屏幕。