首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >银光OpenFileDialog DoEvents等效

银光OpenFileDialog DoEvents等效
EN

Stack Overflow用户
提问于 2009-11-13 18:24:58
回答 2查看 1.7K关注 0票数 1

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

代码语言:javascript
复制
if (FileDialog.ShowDialog() == true) { 
    // process really big file
}

这就冻结了UI,所以在用户选择文件之前,我试图首先显示一条加载消息,以直观地提示用户正在发生什么事情:

代码语言:javascript
复制
loadingMessage.Visibility = Visibility.Visible;
if (FileDialog.ShowDialog() == true) { 
    // process really big file
}

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

我发现,如果我在文件选择之后立即启动一个MessageBox,那么它就能很好地工作。我认为它在引擎盖下执行"DoEvents“类型的调用,以便在运行时获取刷新事件/ui项。

代码语言:javascript
复制
loadingMessage.Visibility = Visibility.Visible;
if (FileDialog.ShowDialog() == true) {
    MessageBox.Show("Sync!");
    // process really big file
}

在这种情况下,大文件仍然被处理得很慢,但是加载消息会显示出来,屏幕UI会被同步(我正在做一些其他的事情,比如显示等待光标)。

问题:

Silverlight没有DoEvents功能。除了MessageBox.Show之外,是否还有一个调用可以产生同步UI和防止OpenFileDialog冻结UI的相同效果?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-11-13 18:46:14

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

票数 1
EN

Stack Overflow用户

发布于 2009-11-13 18:31:46

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1731001

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档