C#精确显示标签X秒并隐藏标签Y秒

本文关键字:标签 隐藏 显示 | 更新日期: 2023-09-27 18:24:41

我正在为一个表单编写代码,该表单应该精确地闪烁一个单词Label。它使用"expositionTime"来显示标签X毫秒,并使用"intervalTime"来隐藏标签Y毫秒

该过程将重复Z次"numExpositions",并在单击按钮后开始。我的代码工作正常,没有错误,我使用两个定时器来完成这项工作。问题是经过一些说明后,计时器会被取消同步

我的问题是,是否有一种解决方案可以为我提供精确的时间同步,其中显示时间(显示标签)和间隔(隐藏)将一起开始和结束-可能在单独的线程上使用计时器,或者监视等待以及如何实现它们

我的部分代码使用两个定时器:

private System.Windows.Forms.Timer timer1;
private System.Windows.Forms.Timer timer2;
private static int counter = 0;
private static int numExpositions = 16;
private static int expositionTime = 2000;
private static int intervalTime = 1800;
// starts both timers that get desynchronized after some time 
private void button1_Click(object sender, EventArgs e) { startTimer1(); startTimer2(); }
public void startTimer1()
{
        timer1 = new System.Windows.Forms.Timer() { Interval = expositionTime + intervalTime };
        timer1.Tick += new EventHandler(OnTimer1Event);
        timer1.Start();
}
public void startTimer2()
{
        timer2 = new System.Windows.Forms.Timer() { Interval = intervalTime };
        timer2.Tick += new EventHandler(OnTimer2Event);
        timer2.Start();
}
private void OnTimer1Event(object sender, EventArgs e)
{
    if (counter >= numExpositions) // stops timers
        {
            timer1.Stop();
            timer2.Stop();
            wordLabel.Visible = false;
            counter = 0;
            this.Close()
        }
        else
        {
            wordLabel.Visible = true; // shows wordLabel
        }
    }
private void OnTimer2Event(object sender, EventArgs e)
{
    wordLabel.Visible = false; // hides wordLabel
}

C#精确显示标签X秒并隐藏标签Y秒

这样做的更好方法是:

private async Task DoIt()
{
    for(int i = 0 ; i < numExpositions; i++)
    {
        wordLabel.Visible = true;
        await Task.Delay(expositionTime); //expositionTime is the number of milliseconds to keep the label visible
        wordLabel.Visible = false;
        await Task.Delay(intervalTime); //intervalTime is the number of milliseconds to keep the label hidden
    }
}
private void button1_Click(object sender, EventArgs e)
{
    DoIt();
}

这要求您使用.NET framework 4.5或更高版本。