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.";
}
我知道这可以使用线程完成,但一个想知道是否有另一种方式。
谢谢你。
Application.DoEvents()
如果这是一个WinForms应用程序Label1.Update()
。如果这还不够:
Label1.Update()
Application.DoEvents()
您通常都需要两者。
由于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任务并行库
'.ContinueWith()'在GUI线程中执行吗?我不这么认为,在这种情况下,您无法从另一个线程更改Label2.Text。你可以使用'.ContinueWith(_ => Label2.Invoke((=)=> Label2.Text = ...))'。 – Timwi 2010-08-12 14:34:37
已更正,谢谢指出。通过正确的同步上下文将不会有任何问题。 – 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();
你想执行或步进放慢尽管代码是一行一行的? – 2010-08-12 14:29:11
如果这是一个应用程序,然后使用Application.DoEvents()。如果这是一个网页,您可能需要使用.net AJAX来实现您想要的功能。 – 2010-08-12 14:40:27