代码之家  ›  专栏  ›  技术社区  ›  Luke Foust

Silverlight OpenFileDialog等同于

  •  1
  • Luke Foust  · 技术社区  · 15 年前

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

    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吗?

    2 回复  |  直到 15 年前
        1
  •  2
  •   Doug Rohrer    15 年前

    使用BackgroundWorker类在后台线程上处理非常大的文件? 以下是您的链接: How to: Use a BackgroundWorker

        2
  •  1
  •   Guy    15 年前

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