我有一个很长的进程,不能异步运行,所以就像你复制文件时的资源管理器一样,我有一个进度对话框。我以模态方式显示对话框,然后执行操作(我们将其称为复制文件以使其保持抽象),更新进度对话框,并使用Application.DoEvents()传递消息以保持应用程序主框架的绘制和响应。
由于该对话框是模式对话框,因此用户除了观看或取消之外不能做其他任何事情。换句话说,他们不能选择菜单项或单击任何按钮。
我一直认为Application.DoEvents是非常邪恶的,因为你可以重新输入你不想重入的代码。但在这种情况下,由于进度对话框是模式对话框,我看不出这是一个糟糕或危险的解决方案的原因。
我是不是忽略了什么,或者在模式对话框中使用Application.DoEvents发送消息是合法的吗?
发布于 2011-12-11 01:28:03
我看不出这种有限的DoEvents使用有什么特别的问题。我们成功地在非常有限的情况下使用它,就像这样,后台处理不是一种选择。
发布于 2011-12-11 01:39:45
通常,应用程序中的UI线程将发送消息。现在,即使模式对话框运行自己的消息泵,这只是为了保持调用行为符合预期(例如,只有当模式对话框关闭时调用才会返回),这对于处理模式对话框本身并不是必需的。(请参阅“旧的新事物”博客中的this blog post )。
因此,调用Application.DoEvents()
也不是什么问题,尽管它通常会显示一个设计问题(例如,UI线程中的非协作处理),并且如果一些窗口消息和事件处理程序相互触发,它可能会导致重新进入-但这与对话模式无关。
https://stackoverflow.com/questions/8461212
复制