c# - 如何逐行执行代码?

时间:2010-08-12 14:23:05

标签: c# process

采用此示例代码

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.";
}

我知道这可以使用线程来完成,但是想知道是否还有其他方法。

谢谢你。

6 个答案:

答案 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();