我有一些代码如下:
App.xaml调用一个SetUp()方法,该方法使用异步调用填充本地集合,并将该集合公开为公共属性。
这一切都很好。
现在我在Silverlight应用程序中创建第一页的实例,如此
private void Application_Startup(object sender, StartupEventArgs e)
{
this.RootVisual = new Summary();
}
在Summary()的构造函数中,我希望这些异步调用已经完成,我的集合将被填充,但异步调用尚未完成。即使我在使用Summary()创建实例之前执行Thread.Sleep(100000 ....),也是如此
问题是,在退出Summary()的构造函数并向用户显示UI时,我的异步调用不会被启动!
什么!!!
我能做些什么,或者只是asyn调用的方式,即他们等到当前工作完成才开始射击?
答案 0 :(得分:1)
这就是我解决这种情况的方法(我将使用简单的字符串下载作为示例): -
private void Application_Startup(object sender, StartupEventArgs e)
{
WebClient web = new WebClient();
web.DownloadStringCompleted += (s, args) =>
{
// Do stuff with args.Result);
this.RootVisual = new Summary();
};
web.DownloadStringAsync(new Uri("SomeUrl.txt", UriKind.Relative));
}
请注意,在异步下载完成之前,Summary
的构造和RootVisual
的分配将被推迟。
答案 1 :(得分:0)
Silverlight专门设计为没有任何阻止操作 - 这就是为什么你必须首先做异步。您真正需要做的是让您的应用程序在等待异步完成处理程序执行时正常运行。
答案 2 :(得分:0)
这是设计的。另一种选择是用户在看到任何东西之前必须等待更长时间。
如果您确实希望阻止显示不完整的夏季,那么首先显示另一个带有“等待”或进度条的页面。从该页面或其父级触发异步事件。然后在异步调用返回时显示摘要。
要处理不完整的摘要,您可能需要使用ICommand
答案 3 :(得分:0)
我知道这是一个旧线程,但对于所有后续读者,我想提供类似问题的经验。如果我理解正确 - 你的异步调用没有完成的原因是你阻止主线程。我遇到了同样的问题,如果你阻塞主线程没有其他线程继续。解决方案是在背景工作者中进行异步调用,并像pauldendulk所说的那样显示一个等待页面。使用Debug.WriteLine()来监视输出中的进程。