2011-12-11 70 views
2

我有一个漫长的过程,我不能异步运行,所以就像复制文件时的资源管理器一样,我有一个进度对话框。我以模态方式显示对话框,然后执行操作(我们将其称为复制文件以使其保持抽象),更新进度对话框,并使用Application.DoEvents()抽取消息以保持应用程序主框架绘画和响应。当模态进度对话框启动时,可以调用“Application.DoEvents”吗?

由于对话框是模态的,用户除了观看或取消之外无法进行其他操作。换句话说,他们不能选择一个菜单项或点击任何按钮。

我一直认为Application.DoEvents是非常邪恶的,因为你可以重新输入你不打算重入的代码。但在这种情况下,由于进度对话框是模态的,所以我看不出这是一个糟糕或危险的解决方案。

我可以忽略一些事情,或者正在使用Application.DoEvents来抽取消息来处理模态对话吗?

+1

为什么你不能在后台线程中运行它?只需使用Background worker,并使用Control.BeginInvoke更新UI。 – BFree

+1

[Some](http://stackoverflow.com/a/5183623/825024)[阅读](http://stackoverflow.com/a/1115410/825024)。 – Otiel

回答

0

我没有看到DoEvents的这种有限使用的特定问题。当后台处理不是一个选项时,我们在非常有限的情况下成功使用它。

0

正常情况下,应用程序中的UI线程会抽取消息。现在,即使模态对话框运行自己的消息泵,但这仅仅是保持呼叫行为与预期一致(例如,只有在模式对话框关闭时才会返回该呼叫),但不必处理模态对话框本身。 (也可参见“新旧事物”博客中的this blog post)。

因此它是不是真的叫Application.DoEvents()要么有问题,即使它通常显示一个设计问题(如非合作处理在UI线程),它可能事业重入如果一些窗口消息和事件处理程序正在触发对方 - 但这与对话模式无关。

相关问题