在C#中通过另一个表单更新表单

时间:2014-01-31 15:30:45

标签: c# forms

我在表单中有一个按钮。单击该按钮时,将调用按钮单击功能。在函数中,首先是另一个表单(让我们从类Form2中调用它对象form2),它创建了一些对象,包括标签和进度条(这些对象是通过form2构造函数创建的)。然后调用form2.Show()。然后是一个while循环,到最后它会更新一些变量。我使用这些变量来更新form2中的几个对象。问题是在按钮单击功能完成之前,表单对象没有正确显示。例如,代替标签,显示白色矩形。我尝试使用Thread.Sleep(1000)来查看对象是否正确显示但是它对form2形状没有任何影响。然后我使用了MessageBox.Show(),这让我惊讶地工作了!对象在form2中正确显示。 如果有人能说出问题是什么以及如何解决,我感激不尽。

2 个答案:

答案 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示例工作的原因!