用户选择大型文件后,我正在处理大文件。我的代码看起来如下:

if (FileDialog.ShowDialog() == true) { 
    // process really big file
}

这使UI冻结了,因此我尝试先显示加载消息,然后用户选择该文件以给他们一个视觉提示,即发生了一些事情:

loadingMessage.Visibility = Visibility.Visible;
if (FileDialog.ShowDialog() == true) { 
    // process really big file
}

不幸的是,在处理文件时,这仍然完全冻结UI。

我发现的完美工作是,如果我在文件选择后立即发出消息框。我认为它在引擎盖下进行“ Doevents”类型调用,以在运行时获得齐平活动/UI项目。

loadingMessage.Visibility = Visibility.Visible;
if (FileDialog.ShowDialog() == true) {
    MessageBox.Show("Sync!");
    // process really big file
}

在这样的情况下,大文件仍然以缓慢的速度处理,但是显示了加载消息,并且屏幕UI被同步了(我在真实的事情中做了其他事情,例如显示等待光标)。

问题:

Silverlight没有Doevents功能。除了MessageBox以外,我可以打个电话。显示具有同步UI并防止OpenFileDialog冻结UI的效果相同吗?

有帮助吗?

解决方案

使用背景工作者在后台执行重型计算。当您要通知UI完成操作已完成时,可以使用上述类的RunWorkerComplet事件。替代方法是使用一个完全独立的线程,然后使用dispatcher.begininvoke()回调到UI线程。请记住,使用.NET在单独的线程中,如果没有这种同步,您将无法访问任何GUI组件。

其他提示

使用背景工类类在背景线程上处理您真正的大文件?这里有一个链接: 如何:使用背景工作者

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top