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

问题描述:

如果这是运行你绝不会看到功能1开始拿这个例子代码c# - 如何逐行执行代码?

private void test() 
{ 
    Label1.Text = "Function 1 started."; 
    function1(); //This function takes a while to execute say 15 seconds. 
    Label2.Text = "Function 1 finished."; 
} 

。所以我的问题是,是否有任何c#函数可以调用显示标签更改。像这样的东西

private void test() 
{ 
    Label1.Text = "Function 1 started."; 
    this.DoProcess();  //Or something like this. 
    function1();    
    Label2.Text = "Function 1 finished."; 
} 

我知道这可以使用线程完成,但一个想知道是否有另一种方式。

谢谢你。

+0

你想执行或步进放慢尽管代码是一行一行的? – 2010-08-12 14:29:11

+0

如果这是一个应用程序,然后使用Application.DoEvents()。如果这是一个网页,您可能需要使用.net AJAX来实现您想要的功能。 – 2010-08-12 14:40:27

Application.DoEvents()

如果这是一个WinForms应用程序Label1.Update()。如果这还不够:

Label1.Update() 
Application.DoEvents() 

您通常都需要两者。

function1可能应该异步运行,不结冰的UI。看看BackgroundWorker课程。

由于UI线程忙于运行代码,因此在更改标签的值之后,它将不会停止刷新表单,直到在重新绘制表单本身之前完成代码。你可以用线程来完成,或者像其他人已经说过的那样,你可以使用Application.DoEvents,这将强制UI线程暂停执行并重新绘制表单。

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任务并行库

+0

'.ContinueWith()'在GUI线程中执行吗?我不这么认为,在这种情况下,您无法从另一个线程更改Label2.Text。你可以使用'.ContinueWith(_ => Label2.Invoke((=)=> Label2.Text = ...))'。 – Timwi 2010-08-12 14:34:37

+0

已更正,谢谢指出。通过正确的同步上下文将不会有任何问题。 – 2010-08-12 14:36:08

哪里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();