顺序控制写法

//第一种方法:获取系统时间,计算时间差来比较延时时间是否到达

enum ProcessStep

{

Step1,

Wait2Seconds,

Step3,

Finished

}

public partial class Form1 : Form

{

private ProcessStep _currentStep = ProcessStep.Step1;

private DateTime _waitStartTime; // 记录开始等待的时间

复制代码
public Form1()
{
    InitializeComponent();
    timer1.Interval = 1000; // 1 秒 tick 一次
    timer1.Tick += timer1_Tick;
}

private void btnStart_Click(object sender, EventArgs e)
{
    _currentStep = ProcessStep.Step1;
    timer1.Start();
}

private void timer1_Tick(object sender, EventArgs e)
{
    switch (_currentStep)
    {
        case ProcessStep.Step1:
            // 做完步骤1后,要等待2秒再进入步骤3
            lblStatus.Text = "步骤1完成,开始等待2秒...";
            _waitStartTime = DateTime.Now;           // 记录开始等待时间
            _currentStep = ProcessStep.Wait2Seconds; // 切到"等待步骤"
            break;

        case ProcessStep.Wait2Seconds:
            // 每次 Tick 检查是否已经过去了 2 秒
            if ((DateTime.Now - _waitStartTime).TotalSeconds >= 2)
            {
                lblStatus.Text = "已经等待2秒,进入步骤3";
                _currentStep = ProcessStep.Step3;
            }
            else
            {
                lblStatus.Text = "还没到2秒,继续等待...";
            }
            break;

        case ProcessStep.Step3:
            lblStatus.Text = "步骤3:执行实际操作...";
            // TODO: 执行步骤3的逻辑
            _currentStep = ProcessStep.Finished;
            break;

        case ProcessStep.Finished:
            lblStatus.Text = "流程结束";
            timer1.Stop();
            break;
    }
}

}

这里 Timer 间隔是 1 秒,但你要等 2 秒:

第一次 Tick:进入 Wait2Seconds,记录时间;

第二次 Tick:可能刚刚 1 秒,还没到 2 秒 ⇒ 继续等待;

第三次 Tick:总共大约 2 秒 ⇒ 进入下一步。

不阻塞 UI,界面不会卡。

//第二种方法:获取系统时间,计数来比较延时时间是否到达

enum ProcessStep

{

Step1,

Wait2Seconds,

Step3,

Finished

}

public partial class Form1 : Form

{

private ProcessStep _currentStep = ProcessStep.Step1;

private int _waitTicksRemaining = 0; // 还需要等待的 Tick 次数

复制代码
public Form1()
{
    InitializeComponent();
    timer1.Interval = 1000; // 1秒
    timer1.Tick += timer1_Tick;
}

private void btnStart_Click(object sender, EventArgs e)
{
    _currentStep = ProcessStep.Step1;
    timer1.Start();
}

private void timer1_Tick(object sender, EventArgs e)
{
    switch (_currentStep)
    {
        case ProcessStep.Step1:
            lblStatus.Text = "步骤1完成,接下来等待2秒...";
            _waitTicksRemaining = 2;                // 需要等2次 Tick
            _currentStep = ProcessStep.Wait2Seconds;
            break;

        case ProcessStep.Wait2Seconds:
            if (_waitTicksRemaining > 0)
            {
                _waitTicksRemaining--;
                lblStatus.Text = $"等待中,还剩 {_waitTicksRemaining} 秒...";
            }

            if (_waitTicksRemaining <= 0)
            {
                lblStatus.Text = "已经等待2秒,进入步骤3";
                _currentStep = ProcessStep.Step3;
            }
            break;

        case ProcessStep.Step3:
            lblStatus.Text = "步骤3:执行操作...";
            // TODO: 实际处理
            _currentStep = ProcessStep.Finished;
            break;

        case ProcessStep.Finished:
            lblStatus.Text = "流程结束";
            timer1.Stop();
            break;
    }
}

}