我正在处理用户选择的大文件。我的代码如下所示:
if (FileDialog.ShowDialog() == true) {
// process really big file
}
这会冻结用户界面,所以我尝试在用户选择文件之前首先显示加载消息,以便为他们提供发生某些事情的视觉提示:
loadingMessage.Visibility = Visibility.Visible;
if (FileDialog.ShowDialog() == true) {
// process really big file
}
不幸的是,在处理文件时,这仍然完全冻结了UI。
我发现,如果我在文件选择后立即触发MessageBox,那么效果很好。我认为它在引擎盖下执行“DoEvents”类型调用以在运行时中获取flush事件/ ui项。
loadingMessage.Visibility = Visibility.Visible;
if (FileDialog.ShowDialog() == true) {
MessageBox.Show("Sync!");
// process really big file
}
在这种情况下,大文件仍然处理缓慢但显示加载消息并且屏幕UI被同步(我正在做其他事情,如显示等待光标)。
问题:
Silverlight没有DoEvents功能。除了MessageBox.Show之外我是否可以进行调用,以便同步UI并阻止OpenFileDialog冻结UI?
答案 0 :(得分:2)
使用BackgroundWorker类在后台线程上处理真正大的文件? 这里有一个链接:How to: Use a BackgroundWorker
答案 1 :(得分:1)
使用BackgroundWorker在后台执行繁重的计算。如果要通知UI操作已完成,可以使用上述类的RunWorkerCompleted事件。替代方法是使用完全独立的线程,然后使用Dispatcher.BeginInvoke()回调UI线程。请记住,在单独的线程中使用.NET时,如果没有这种同步,则无法访问任何GUI组件。