什么时候我需要调用DoEvents函数?

3
如果我正在循环进行一个耗时的操作(比如处理文件),并且我想更新进度条,那么我需要使用DoEvents,就我所了解的而言。
但是在每次循环函数中调用它只会导致进度条的动画播放得非常快(或慢,取决于操作)。我知道这是因为DoEvents让进度条"呼吸",缺乏更好的措辞,导致它和整个窗体刷新。
我的问题是,你怎么知道适合调用DoEvents?显然你不能随心所欲地经常调用它 - 这会导致零散的动画,以及其他问题。那么有没有一种快速的方法来检查一个表单/应用程序是否需要调用DoEvents?
3个回答

8

哦,我真是太蠢了 - 我打了自己一巴掌。

我应该使用后台线程来处理,让UI线程保持空闲。


1
“Application.DoEvents();”确实存在,但是强烈不建议广泛使用它,它只是为了支持旧版本而存在,至少我是这么读到的。 - qJake
确实是这样。更准确地说,这是由于对遗留VB代码的支持。如果我没记错的话。 - jcolebrand
是的,VB5/6在表单中有DoEvents(没错,就是这样),它可以做到这一点。 - qJake

1

如果您不想纠结于线程,也不介意进行一些测试,那么Visual Studio Async CTP可能值得一看——它基本上是“以正确的方式完成DoEvents”(还有更多)。

关于这些新异步特性的介绍,我建议查看Eric Lippert的博客


“以正确的方式执行DoEvents”是一个不错的描述,我可能会借鉴这个。顺便提一下,我还没有介绍如何使用通知(如进度条等)执行异步任务。希望在未来的节目中能够介绍。 - Eric Lippert
@Eric:请便!我期待着阅读那一集... :-) - Heinzi

1

不必纠结于线程,你可以使用BackgroundWorker。它简化了在窗体上执行工作和更新控件的过程,因为你不能直接从非 UI 线程更新 UI 控件。文档中的示例更新了一个标签控件,但你可以轻松修改它以使用进度条。


是的,这是真的,但是我的“工作”线程实际上需要更新更多内容——大约5个标签和一个进度条。在这种情况下,使用线程和Invoke()更容易,但对于更简单的实现,BackgroundWorker肯定会很有用。 - qJake

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接