Silverlight OpenFileDialog DoEvents等效

时间:2009-11-13 18:24:58

标签: silverlight openfiledialog

我正在处理用户选择的大文件。我的代码如下所示:

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?

2 个答案:

答案 0 :(得分:2)

使用BackgroundWorker类在后台线程上处理真正大的文件? 这里有一个链接:How to: Use a BackgroundWorker

答案 1 :(得分:1)

使用BackgroundWorker在后台执行繁重的计算。如果要通知UI操作已完成,可以使用上述类的RunWorkerCompleted事件。替代方法是使用完全独立的线程,然后使用Dispatcher.BeginInvoke()回调UI线程。请记住,在单独的线程中使用.NET时,如果没有这种同步,则无法访问任何GUI组件。