代码之家  ›  专栏  ›  技术社区  ›  Tom

Silverlight和异步调用问题

  •  2
  • Tom  · 技术社区  · 16 年前

    我有一些代码工作如下:

    app.xaml调用一个setup()方法,该方法使用异步调用填充本地集合,并将该集合作为公共属性公开。

    都很好。

    现在我在我的Silverlight应用程序中创建了第一个页面的实例,就像这样

        private void Application_Startup(object sender, StartupEventArgs e)
        {
            this.RootVisual = new Summary();
        }
    

    在summary()的构造函数中,我希望这些异步调用已经完成,并且要填充集合,但异步调用尚未完成。即使我在summary()上创建实例之前执行了一个thread.sleep(100000…..),情况也是如此。

    问题是,在summary()的构造函数退出并向用户显示UI之前,我的异步调用不会被启动!

    什么!!!!

    有什么我可以做的,或者这只是Asyn调用工作的方式,即他们等到当前工作完成后再开火?

    4 回复  |  直到 12 年前
        1
  •  1
  •   AnthonyWJones    16 年前

    这就是我解决这种情况的方法(我将以简单的字符串下载为例):-

    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 延迟到异步下载完成。

        2
  •  0
  •   Gabe Timothy Khouri    16 年前

    Silverlight是专门为不进行任何阻塞操作而设计的——这就是为什么首先必须进行异步操作的原因。您真正需要做的是让应用程序在等待异步完成处理程序执行时正常运行。

        3
  •  0
  •   pauldendulk    16 年前

    这是按设计的。另一种选择是,用户必须等待更长的时间才能看到任何东西。

    如果你真的想避免显示一个不完整的夏季,那么首先显示另一个带有“等待”或进度条的页面。从该页或其父页激发异步事件。然后在异步调用返回时显示摘要。

    要处理不完整的摘要,您可能需要使用 ICommand

        4
  •  0
  •   F.H. Theophilus Omoregbee    12 年前

    我知道这是一条古老的线索,但对于所有的读者来说,我想为我的经历提供一个类似的问题。如果我理解正确的话-异步调用没有完成的原因是因为您阻塞了主线程。我遇到了同样的问题,如果您阻塞主线程,其他线程都不会继续。解决方案是在后台工作人员内部进行异步调用,然后像Pauldendulk所说的那样显示一个等待页面。使用debug.writeline()监视输出中的进程。