Multithreading 是否有一种方法可以创建UI元素并使其可取消?

Multithreading 是否有一种方法可以创建UI元素并使其可取消?,multithreading,windows-phone-7,grid,rendering,Multithreading,Windows Phone 7,Grid,Rendering,我有一个在WP7应用程序中输入图表页面时调用的方法。它生成对象列表并填充列表框。每个ListBoxItem的内容是一个包含10列数据的网格。即使有1000-2000个项目,列表生成的速度也非常快。但一旦该方法开始构建网格并将其添加到列表框中,它就会变得相对较慢。现在,我的意思是,它只占用设备的一半时间,相当于我的第二代iPodtouch上的一个类似应用程序。因此,只要用户想要数据图表,性能就非常好 如果用户点击开始按钮,应用程序将退出,因此这不是问题。我关心的是当用户返回到上一页时。应用程序只是

我有一个在WP7应用程序中输入图表页面时调用的方法。它生成对象列表并填充列表框。每个ListBoxItem的内容是一个包含10列数据的网格。即使有1000-2000个项目,列表生成的速度也非常快。但一旦该方法开始构建网格并将其添加到列表框中,它就会变得相对较慢。现在,我的意思是,它只占用设备的一半时间,相当于我的第二代iPodtouch上的一个类似应用程序。因此,只要用户想要数据图表,性能就非常好

如果用户点击开始按钮,应用程序将退出,因此这不是问题。我关心的是当用户返回到上一页时。应用程序只是等待方法运行。我在Kindle等主流应用中也注意到类似的行为。但我对市场商店没有那种影响力!我有一个持续运行的进度条,所以行为是相同的


出于对被MarketPlace拒绝的担忧,我尝试将该方法放入BackgroundWorker流程,但失败了,因为它在创建UI元素时遇到了瓶颈,而UI元素正在UI线程上运行,因此我遇到了访问错误。是否有一种方法可以创建UI元素(如网格)并使其可取消?

您应该使用BackgroundWorker。当您需要更新UI时,请使用以下代码

Dispatcher.BeginInvoke(() =>
{
   textBlock.Text = "some text";
   etc
   etc
}

你应该使用BackgroundWorker。当您需要更新UI时,请使用以下代码

Dispatcher.BeginInvoke(() =>
{
   textBlock.Text = "some text";
   etc
   etc
}

您是否在代码中手动在每个
ListBoxItem
中创建UI元素?如果是这样,您会发现使用数据绑定可以提高性能,因为
ListBox
使用
virtualzingstackpanel
作为项目容器,因此它实际上只会创建足够多的UI元素以供查看和立即滚动到。当用户开始滚动时,会创建其他元素。Silverlight for Windows Phone性能团队在上发表了一篇很好的文章


如Peter Torr在其文章中所解释的,如果数据集特别大,您可能会通过使用数据虚拟化(或相反)来发现进一步的对等性能改进。

您是否在代码中手动在每个
ListBoxItem
中创建UI元素?如果是这样,您会发现使用数据绑定可以提高性能,因为
ListBox
使用
virtualzingstackpanel
作为项目容器,因此它实际上只会创建足够多的UI元素以供查看和立即滚动到。当用户开始滚动时,会创建其他元素。Silverlight for Windows Phone性能团队在上发表了一篇很好的文章


如Peter Torr在其文章中所解释的,如果数据集特别大,您可能会发现通过使用数据虚拟化(或相反)进一步改善了PeerPerformance。

是的,在添加项目之间,检查是否已取消。是的,在添加项目之间,检查它是否被取消。@Derek-在发布这篇文章后做更多的研究时,我了解了这一点,并检查了那篇文章和代码。我将尝试利用它或类似的东西来分块数据。有趣的是,我发现当数据绑定时,用户界面变得更具响应性。但是,使用大量行的滚动性能非常差。在“正常”使用中,用户将更高兴地看到更好的滚动。我真正担心的只是后退按钮的问题。正如我在文章中提到的,基本性能远远好于可比的iOS应用程序(altho on old,Second gen Touch)。@Derek-关于Torr的帖子,如果有人能举个例子,将其与一些“真实”数据结合使用,我将不胜感激。我发现很难破译什么是IList代码以及什么被用作示例数据。我自己正在做这件事,当我把它全部清理干净后,我会发布一个示例。到目前为止,测试是积极的。与我以前的方式相比,使用较小的结果集滚动时会有一个较小的用户体验损失。但是,对于较大的结果集,在加载较大的结果集(例如2000行)之前,将花费30秒时间加载,并将backbutton冻结那么长的时间,因此损失较小。使用这种新方法,在绘制第一组结果之前,backbutton仍处于冻结状态,但无论结果集大小如何,它都不超过2秒。如前所述,一个例子即将到来。最终可能会有更好的解决方案,但这已经大大改善了我所拥有的。到目前为止,在测试中,创建最多列表项所需的最长时间是2秒。它永远不会少,但重要的是它永远不会多。是我从Torr的示例中创建的一个示例,使用一些测试数据,还允许测试“后退”按钮。@Derek-在发布后进行更多研究时,我了解了这一点,并查看了该帖子和代码。我将尝试利用它或类似的东西来分块数据。有趣的是,我发现当数据绑定时,用户界面变得更具响应性。但是,使用大量行的滚动性能非常差。在“正常”使用中,用户将更高兴地看到更好的滚动。我真正担心的只是后退按钮的问题。正如我在文章中提到的,基本性能远远好于可比的iOS应用程序(altho on old,Second gen Touch)。@Derek-关于Torr的帖子,如果有人能举个例子,将其与一些“真实”数据结合使用,我将不胜感激。我发现很难破译什么是IList代码以及什么被用作示例数据。我自己正在做这件事,当我把它全部清理干净后,我会发布一个示例。到目前为止,测试是积极的。与我以前的方式相比,使用较小的结果集滚动时会有一个较小的用户体验损失。但如果结果集更大,那么