Silverlight 如何阻止UI冻结?

Silverlight 如何阻止UI冻结?,silverlight,silverlight-4.0,silverlight-3.0,Silverlight,Silverlight 4.0,Silverlight 3.0,当我向画布添加许多项时,为什么UI会冻结?假设我有一个从1到1000的循环。我只能在添加了1000个元素之后才能看到所有元素。为什么画布在每次添加或删除项目时不显示一个项目 我能做些什么来达到这个效果?我想动画的元素,因为他们被添加到画布上一个接一个的时间。但是动画没有显示,因为UI只是冻结 提前感谢:)在VB.NET中,我们使用Application.DoEvents(),但我觉得在Silverlight中这是不可能的 阅读这篇文章: 希望这有帮助 也许您可以使用计时器,在每个刻度上添加较少的

当我向画布添加许多项时,为什么UI会冻结?假设我有一个从1到1000的循环。我只能在添加了1000个元素之后才能看到所有元素。为什么画布在每次添加或删除项目时不显示一个项目

我能做些什么来达到这个效果?我想动画的元素,因为他们被添加到画布上一个接一个的时间。但是动画没有显示,因为UI只是冻结


提前感谢:)

在VB.NET中,我们使用Application.DoEvents(),但我觉得在Silverlight中这是不可能的

阅读这篇文章:


希望这有帮助

也许您可以使用计时器,在每个刻度上添加较少的元素?这样可以确保在每次添加之间进行一些刷新


在一个画布上有很多形状的项目中,我发现在开始时预先分配和添加所有形状,然后切换它们的可见性是很有帮助的。我不知道这通常是否有用,或者只是针对我所处的情况。

您的代码正在UI线程(更新屏幕的同一线程)上执行。因此,当您执行任何计算密集型操作时,您的UI将冻结。长时间运行的操作必须在单独的线程中运行,以使应用程序保持响应。启动一个新线程,然后从线程内部迭代循环并实例化对象。要将对象添加到画布,您必须使用
调度程序
,以确保部分代码在UI线程上运行

MyElement element = new MyElement();
Dispatcher.BeginInvoke(() => AddElementToCanvas(element));

应该使用哪个线程来创建
MyElement
的实例?当有大量的UI操作要实现时,你真的别无选择,只能在UI线程上执行它们。你必须提前实例化项并将它们存储在列表中。然后,您可以在另一个线程中将项目分派到画布上。i、 e.DoWork-DoWork=delegate(intj){Canvas.Children.Add(矩形[j]);};线程工作线程=新线程(新线程开始(()=>{for(inti=0;i<1000;i++){Dispatcher.BeginInvoke(doWork,i);Thread.Sleep(100);}});workerThread.Start();您可能会发现这个问题的答案有点相关:计时器会严重影响性能,因为我要添加1000项。没有定时器也需要4-5秒来建立。计时器会使情况恶化。我可能会删除动画,而不是性能瓶颈。