2011-12-11 79 views
0

我有一个运行大量代码的页面,为用户准备页面和页面布局。如何在执行代码时运行加载器动画?

它只需要在蓝色月亮中使用一次。但是当它发生时,大约需要等待用户三秒钟。

显然,微软只允许等待2秒或更少。 Daaaaang。

我已经对代码进行了优化和优化,没有办法绕开代码:代码尽可能快。自然,我着手制作一个装载机。

我试图更新几个控件,但由于UI线程被冻结,他们没有工作。

我搜索,搜索和搜索,发现this,这是混乱,并没有真正的帮助,部分原因是WP7的C#版本,部分原因是我在C#初学者。

如何在UI线程冻结时制作装载程序?

回答

2

Silverlight Toolkit For Windows Phone引入了PerformanceProgressBar,“described in this WindowsPhone Geek article”将专门用于动画的合成器线程替代UI(用户界面)线程“。这应该可以帮助你处理冻结的用户界面。由于并行执行(由Merlyn建议),我建议QueueUserWorkItem方法在BackgroundWorker之上的单独线程中执行代码,从而使UI线程在UI更新中处于活动状态,但正如文章中所述,您将需要使用Dispatcher.BeginInvoke从那里更新您的用户界面。

+1

谢谢!我终于有了一个进度条,即使它在模拟器上显示得稍慢一点,也不会显示%完成的情况。另外,我将您的代表提升到了4位数区域! – JavaAndCSharp

1

您可以尝试使用the BackgroundWorker class。该页面有一个关于如何使用它的教程。

看到这个问题和我的答案为另一个教程。虽然不是Windows Phone 7的具体的,它仍然有做更新UI在等待任务完成:

下面是使用BackgroundWorker了Windows Phone 7的具体教程:

+0

我尝试了几次,有几种不同的配置,总是得到某种错误或其他。当使用MSDN页面和以前的答案中的一些代码时,我收到一条消息:“System.UnauthorizedAccessException未处理”和“无效的跨线程访问”。幸运的是,我能够用托马斯的回答来拯救某种装载机。不管怎么说,还是要谢谢你;你的回答让我开始思考BackgroundWorker的世界。 – JavaAndCSharp

+1

@JavaAndCSharp:您试图在后台线程中更新UI。您需要使用“Dispatcher”类将更新发布到您的UI。请参阅:http://stackoverflow.com/questions/1924408/invalid-cross-thread-access-issue –

+1

@JavaAndCSharp:'BackgroundWorker'优于其他选项的优点是,如果您有一个长时间运行的任务,并且您想要支持取消,它已经有一个内置的机制。请参阅:http:// stackoverflow。com/questions/7731610/cancel-threadpool-queueuserworkitem-task - 如果你使用'QueueUserWorkItem',你可以从这个问题中看到你必须“自己动手”取消取消。如果你的任务没有那么长时间,并且你永远不想取消它,那么不要担心它:) –