2011-11-29 66 views
2

在我的Silverlight应用程序,我有我想用的一个操作,即需要几秒钟,强烈的相互作用与GUI(在一个大的创作显示对象“为”语句)BackgroundWorker的更新GUI

在第一BackgroundWorker避免冻结界面。但是我不能直接更新GUI,所以我使用了Dispatcher.BeginInvoke,但它仍冻结了界面(因为长时间的操作都在GUI部分)。

我想要的是在加载我的对象时显示BusyIndi​​cator,但我希望用户能够在加载时继续工作。

我还能做什么?有什么建议么?

+0

为什么你需要以编程方式创建许多UI元素? –

回答

4

在BackgroundWorker中创建UI项目是错误的。如果从BackgroundWorker运行,创​​建UI元素需要切换回UI线程。这只是让事情比在主线上创建它们更糟糕。

我假设BackgroundWorker中的大量工作不是创建元素,而是在一切中间创建UI元素的一些附加处理。
如果是这种情况,您需要分解实际的UI元素。用包含构建所有元素所需要的所有规范的虚拟类替换UI元素的生成。然后,您返回该规范集合(虚拟类)并生成BackgroundWorker.RunWorkerCompleted事件中的实际元素。

+1

+1好答案。一旦完成这个分离,就可以使用调用和数据绑定来实际生成UI元素 – AnthonyWJones

5

即使是忙碌的图标也无法帮到你。忙图标或任何其他图形项目需要UI线程抽取消息才能“冻结”UI。如果长时间运行的操作正在UI线程上运行,那么即使忙碌的光标也会“冻结”。

你需要或者

  1. 移动昂贵的长期运行的逻辑到后台线程
  2. 分手的UI逻辑成块,让UI刷新它们之间。