1

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

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 相同的效果吗?

4

2 回答 2

2

使用 BackgroundWorker 类在后台线程上处理您真正的大文件?这里有一个链接:如何:使用 BackgroundWorker

于 2009-11-13T18:31:46.673 回答
1

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

于 2009-11-13T18:46:14.193 回答