采用此示例代码
private void test()
{
Label1.Text = "Function 1 started.";
function1(); //This function takes a while to execute say 15 seconds.
Label2.Text = "Function 1 finished.";
}
如果运行此操作,您将永远不会看到功能1启动。所以我的问题是,是否有任何c#函数可以调用show更改标签。像这样的东西
private void test()
{
Label1.Text = "Function 1 started.";
this.DoProcess(); //Or something like this.
function1();
Label2.Text = "Function 1 finished.";
}
我知道这可以使用线程来完成,但是想知道是否还有其他方法。
谢谢你。
答案 0 :(得分:6)
Application.DoEvents()
答案 1 :(得分:4)
如果这是一个WinForms应用,Label1.Update()
。如果这还不够:
Label1.Update()
Application.DoEvents()
您通常需要两者。
答案 2 :(得分:3)
您的function1
应该异步运行,以免冻结UI。看一下BackgroundWorker课程。
答案 3 :(得分:3)
var context = TaskScheduler.FromCurrentSynchronizationContext(); // for UI thread marshalling
Label1.Text = "Function 1 started.";
Task.Factory.StartNew(() =>
{
function1();
}).ContinueWith(_=>Label2.Text = "Function 1 finished.", context);
.NET 4任务并行库
答案 4 :(得分:1)
由于UI线程正在忙于运行代码,因此在更改标签的值之后,它将不会停止刷新表单,直到它重新完成表单本身之前已完成代码。您可以使用线程执行此操作,或者如其他人已经说过的那样,您可以使用Application.DoEvents
,这将强制UI线程暂停执行并重新绘制表单。
答案 5 :(得分:0)
private void test()
在哪里被召唤?
如果不在UI线程中,那么您可能需要delegate
:
public delegate void UpdateLabelStatus(string status);
...
private void test()
{
Invoke(new UpdateLabelStatus(LabelStatus1), status);
...
}
private void LabelStatus1(string status)
{
Label1.Text = status;
}
否则,您应该可以Label1.Update();
然后Application.DoEvents();