在WinForms中,如何从UI线程强制立即更新UI?
我所做的大致是:
label.Text = "Please Wait..."
try
{
SomewhatLongRunningOperation();
}
catch(Exception e)
{
label.Text = "Error: " + e.Message;
return;
}
label.Text = "Success!";
标签文本未设置为“请稍候...”在手术前。
我为操作使用了另一个线程来解决这个问题,但是它变得复杂了,我想简化代码。
发布于 2010-04-03 03:25:13
起初,我想知道为什么OP还没有将其中一个响应标记为答案,但在我自己尝试它仍然不起作用后,我更深入地挖掘了一下,发现这个问题比我最初想象的要多得多。
通过阅读类似的问题可以获得更好的理解:Why won't control update/refresh mid-process
最后,为了记录,我能够通过执行以下操作来更新我的标签:
private void SetStatus(string status)
{
lblStatus.Text = status;
lblStatus.Invalidate();
lblStatus.Update();
lblStatus.Refresh();
Application.DoEvents();
}
尽管据我所知,这远不是一种优雅和正确的方法。这是一种黑客攻击,它可能会工作,也可能不会工作,这取决于线程的繁忙程度。
发布于 2009-09-01 07:07:30
在设置标签后调用Application.DoEvents()
,但您应该在单独的线程中执行所有工作,以便用户可以关闭窗口。
发布于 2018-11-29 04:44:34
如果您只需要更新几个控件,那么.update()就足够了。
btnMyButton.BackColor=Color.Green; // it eventually turned green, after a delay
btnMyButton.Update(); // after I added this, it turned green quickly
https://stackoverflow.com/questions/1360944
复制相似问题