在用户选择大型文件后,我正在处理它们。我的代码如下所示:
if (FileDialog.ShowDialog() == true) {
// process really big file
}这就冻结了UI,所以在用户选择文件之前,我试图首先显示一条加载消息,以直观地提示用户正在发生什么事情:
loadingMessage.Visibility = Visibility.Visible;
if (FileDialog.ShowDialog() == true) {
// process really big file
}不幸的是,在处理文件时,这仍然会完全冻结UI。
我发现,如果我在文件选择之后立即启动一个MessageBox,那么它就能很好地工作。我认为它在引擎盖下执行"DoEvents“类型的调用,以便在运行时获取刷新事件/ui项。
loadingMessage.Visibility = Visibility.Visible;
if (FileDialog.ShowDialog() == true) {
MessageBox.Show("Sync!");
// process really big file
}在这种情况下,大文件仍然被处理得很慢,但是加载消息会显示出来,屏幕UI会被同步(我正在做一些其他的事情,比如显示等待光标)。
问题:
Silverlight没有DoEvents功能。除了MessageBox.Show之外,是否还有一个调用可以产生同步UI和防止OpenFileDialog冻结UI的相同效果?
发布于 2009-11-13 18:46:14
使用BackgroundWorker在后台执行繁重的计算。当您想通知UI操作已经完成时,可以使用上述类的RunWorkerCompleted事件。替代方法是使用一个完全独立的线程,然后使用Dispatcher.BeginInvoke()对UI线程进行回调。请记住,在单独的线程中使用.NET,如果没有这种同步,您就无法访问任何GUI组件。
发布于 2009-11-13 18:31:46
使用BackgroundWorker类在后台线程上处理真正的大文件?这里有一个你的链接:如何:使用BackgroundWorker
https://stackoverflow.com/questions/1731001
复制相似问题