我的Windows窗体上有一个textBox2(确认名称和拼写)我将一个计时器从工具箱中吸取到我的窗体上,它被命名为timer1。我试图让按钮按下时启动计时器,并让textBox2显示每个递增秒,以便显示整个过程花费了多长时间的运行时间。我在哪里错了?
public partial class Form1 : Form
{
private int duration = 0;
private void button1_Click(object sender, EventArgs e)
{
timer1.Enabled = true;
timer1.Start();
First();
Second();
Thirds();
Fourth();
Fifth();
timer1.Stop();
}
private void timer1_Tick(object sender, EventArgs e)
{
duration++;
textBox2.Text = duration.ToString();
}
}
答案 0 :(得分:2)
目前尚不清楚方法First()
,Second()
等代表什么。但基于其余的代码,似乎这些是你想要计时的长期任务。
在任何情况下,问题是在您停止计时器之前,您永远不会从button1_Click()
方法返回。计时器滴答在UI线程中引发,并且只有在UI线程未被处理其他事件阻止时才能引发。就像处理button1
的{{1}}事件一样。
您应该在单独的线程中执行长时间运行的操作,例如使用Click
。然后计时器将正常工作,或者您甚至可以使用Task
方法中的循环来显示已用时间,无论您喜欢哪个。
例如:
async
注意:
private int duration = 0;
private async void button1_Click(object sender, EventArgs e)
{
timer1.Enabled = true;
timer1.Start();
await Task.Run(() =>
{
First();
Second();
Thirds();
Fourth();
Fifth();
});
timer1.Stop();
}
private void timer1_Tick(object sender, EventArgs e)
{
duration++;
textBox2.Text = duration.ToString();
}
功能,C#5.0的新功能。请参阅下文,了解与旧版本的C#和.NET兼容的不同方法。await
时,包含语句的await
方法将执行“等待”表达式。此时,线程的控制权将返回给async
方法的调用者。稍后,当等待的表达式最终完成时,线程的控制将在之前产生的点(即async
语句)返回到async
方法。await
中的五个方法在另一个线程中异步执行。当Task
启动时,Task
方法实际返回其调用者。如果他们(即button1_Click()
)最终完成,Task
方法的执行将在下一个语句中继续执行:button1_Click()
。
timer1.Stop()
/ async
功能使得使用异步操作的代码更容易编写。但即使在此之前,还有其他机制可以做同样的事情。这是一种使用await
对象的机制:
BackgroundWorker
注意:
private async void button1_Click(object sender, EventArgs e)
{
BackgroundWorker worker = new BackgroundWorker();
worker.DoWork += (sender1, e1) =>
{
First();
Second();
Thirds();
Fourth();
Fifth();
};
worker.RunWorkerCompleted += (sender1, e1) =>
{
timer1.Stop();
};
timer1.Enabled = true;
timer1.Start();
worker.RunWorkerAsync();
}
对象时,它会捕获当前的同步上下文(如果有),稍后将用于引发除BackgroundWorker
之外的所有BackgroundWorker
个事件。DoWork
事件。即使在执行长时间运行的工作时,这也允许在UI线程上发生事情。DoWork
和DoWork
事件的匿名方法声明的。RunWorkerCompleted
本身。只有在调用BackgroundWorker
方法时,工作人员才会通过提升RunWorkerAsync()
事件来开始运行。
顺便说一句,虽然我保留原始代码尽可能完整,但请注意您不需要 DoWork
和timer1.Enabled = true;
。要么足以启动计时器;你可以使用你喜欢的任何一个,而忽略另一个。