在C#中关闭MessageBox后,如何强制按钮,TextBoxes在表单上重绘

我有一个带有按钮,textBoxes和userControls的表单。 单击按钮时,它会调用另一个类中的方法。 在此类中,将打开一个消息框。 当用户单击“确定”时,messageBox将关闭,并且类方法将在结束前持续10秒左右。 在这10秒钟内,消息框所在的textBox或按钮仍然显示messageBox(它们没有重新绘制)。

问题是我如何强制在表格上重绘一切。 问题是具有messageBox的类不具有调用它的表单的任何知识

坦率

你可以试试

Application.DoEvents() 

消息框关闭后。 但是 – 除非您在后台线程中执行您在其他类中调用的方法 – 否则您的UI将不会响应10秒。

完全在UI中完成工作需要10秒吗? 如果没有,它应该在一个单独的线程上完成。 即使您自己刷新表单,您仍然会在10秒内没有响应的UI,这并不理想。

有关在不同线程中执行代码并回调UI线程的示例,请参阅我的线程教程 。 请注意,这是“旧”的做事方式 – BackgroundWorker使事情变得更简单。

这里的问题是您在UI线程上进行了处理并阻止了绘制消息。 调用Refresh或Invalidate不会解决这个问题,因为您仍在阻塞执行这些操作的线程。

相反,你应该进行处理并将其移动到另一个线程,然后在后台线程上执行工作时更新你的UI线程(适当地,通过Invoke方法,更有可能)。

要强制重绘所有内容,可以在主窗体上调用Invalidate()。

您的问题是您正在UI线程上工作。 在您的方法返回之前,UI不会重新绘制,这将允许Windows消息循环继续。

解决方案是在不同的线程上运行您的工作方法。 也许BackgroundWorker类可以很好地解决您的问题。

编辑:有关深入解释,请参阅此文章:
http://www.yoda.arachsys.com/csharp/threads/winforms.shtml