我在表单中有一个按钮。单击该按钮时,将调用按钮单击功能。在函数中,首先是另一个表单(让我们从类Form2中调用它对象form2),它创建了一些对象,包括标签和进度条(这些对象是通过form2构造函数创建的)。然后调用form2.Show()。然后是一个while循环,到最后它会更新一些变量。我使用这些变量来更新form2中的几个对象。问题是在按钮单击功能完成之前,表单对象没有正确显示。例如,代替标签,显示白色矩形。我尝试使用Thread.Sleep(1000)来查看对象是否正确显示但是它对form2形状没有任何影响。然后我使用了MessageBox.Show(),这让我惊讶地工作了!对象在form2中正确显示。 如果有人能说出问题是什么以及如何解决,我感激不尽。
答案 0 :(得分:0)
您正在阻止UI线程,从而阻止更新,直到您释放UI线程以继续处理发送给它的其他消息。
如果您长时间运行CPU绑定工作,则应将其卸载到另一个后台线程。如果要执行IO或其他非CPU绑定工作,则应该异步执行,而不是同步阻塞,以便UI线程可以继续处理其他事件。
答案 1 :(得分:-1)
如果你从事繁重的工作,你真的应该在后台工作者那里做。
同时(为了使其正常工作),您可以致电Application.DoEvents
,这应该让您的控件“时间”更新。
取自MSDN: http://msdn.microsoft.com/en-us/library/system.windows.forms.application.doevents%28v=vs.110%29.aspx
foreach (string file in files )
{
System.IO.FileInfo fileInfo = new System.IO.FileInfo(file);
System.IO.FileStream fileStream = fileInfo.OpenRead();
pictureBox1.Image = System.Drawing.Image.FromStream(fileStream);
Application.DoEvents();
fileStream.Close();
// Call Sleep so the picture is briefly displayed,
//which will create a slide-show effect.
System.Threading.Thread.Sleep(2000);
}
如果您对更多细节感兴趣,Hans会有一个很好的解释:https://stackoverflow.com/a/5183623/2243584
人们总是可以争论Application.DoEvents的使用,但正如Hans所说,ShowDialog也在内部使用它 - 这就是你的MessageBox示例工作的原因!