c# - 计时器每秒触发一次并更新 GUI(C# Windows 窗体)
问题描述
我有一个 Windows 窗体应用程序,我需要一个计时器工作 90 秒,并且应该在它过去后显示每一秒,有点像秒表 1..2..3 等,在 90 秒结束后,它应该抛出有问题的例外。
我有以下代码,但从RunEvent
不触发。
private void ScanpXRF()
{
bool demo = false;
System.Windows.Forms.Timer timer = new System.Windows.Forms.Timer();
try
{
for (int timerCounter = 0; timerCounter < 90; timerCounter++)
{
timer.Interval = 1000;
timer.Tick += new EventHandler(RunEvent);
timer.Start();
if(timerCounter == 89) {
throw new Exception();
}
}
}
catch (Exception e)
{
timer.Dispose();
MessageBox.Show("There is a problem!");
}
}
private void RunEvent(object sender, System.EventArgs e)
{
//boxStatus.AppendText("RunEvent() called at " + DateTime.Now.ToLongTimeString() + "\n");
MessageBox.Show("timer fired!");
}
我在这里做错了什么还是有其他建议可以通过其他方法来达到相同的结果?
解决方案
计时器需要在表单级别声明,否则在表单关闭时可能不会被丢弃:
System.Windows.Forms.Timer timer;
int counter = 0;
您的起始代码应该只是启动计时器:
private void ScanpXRF()
{
counter = 0;
timer = new System.Windows.Forms.Timer();
timer.Interval = 1000;
timer.Tick += RunEvent;
timer.Start();
}
RunEvent 是您的 Tick 事件每秒被调用一次,因此您的逻辑需要进入:
private void RunEvent(object sender, EventArgs e)
{
counter++;
if (counter >= 90) {
timer.Stop();
// do something...
}
}
推荐阅读
- mysql - 无法识别的语句类型。(靠近位置 38 的“BY”)
- php - echo 多个字段属于一个字段,不用多次打印一个字段php
- php - Symfony 4 测验风格表格,嵌入式集合类型
- javascript - 如何将javascript中的值发送到django
- c# - SqlException:无法将值 NULL 插入列“CarId”、表“AutoServiceDb.dbo.ServiceOrders”;列不允许空值。插入失败
- python - 仅当辅助值不为空或 nan 时才更新主值
- r - R根据另一个数据框的完全匹配替换列的值
- asp.net - .NET Framework 4.7 与 .NET Core 3.0 中 HTTP 请求的不同性能
- python - 如果文件以 _ 开头,则无法使用 xml.etree.ElementTree 解析 xml 文件
- amazon-web-services - 如何将物联网数据存储到 Amazon RDS MySQL 数据库中?