2

我的程序有一个参数可以启动 winform 并在运行函数之前等待x秒数。目前我正在使用线程睡眠x秒,然后函数运行。如何在条状态标签中添加计时器?

所以它说:x Seconds Remaining...

4

2 回答 2

12

Instead of blocking thread execution, simply call your method when required timeout passes. Place new Timer to your form, and set it's Interval to 1000. Then subscribe to timer's Tick event and calculate elapsed time in event handler:

private int secondsToWait = 42;
private DateTime startTime;

private void button_Click(object sender, EventArgs e)
{
    timer.Start(); // start timer (you can do it on form load, if you need)
    startTime = DateTime.Now; // and remember start time
}

private void timer_Tick(object sender, EventArgs e)
{
    int elapsedSeconds = (int)(DateTime.Now - startTime).TotalSeconds;
    int remainingSeconds = secondsToWait - elapsedSeconds;

    if (remainingSeconds <= 0)
    {
        // run your function
        timer.Stop();
    }

    toolStripStatusLabel.Text = 
        String.Format("{0} seconds remaining...", remainingSeconds);
}
于 2013-08-01T22:31:24.707 回答
1

您可以使用Timer

public class Form1 : Form {
    public Form1(){
        InitializeComponent();
        t = new Timer {Interval = 1000};
        t.Tick += Tick;
        //try counting down the time
        CountDown(100);
    }
    DateTime start;
    Timer t;  
    long s;
    public void CountDown(long seconds){
       start = DateTime.Now;
       s = seconds;
       t.Start();
    }
    private void Tick(object sender, EventArgs e){
       long remainingSeconds = s - (DateTime.Now - start).TotalSeconds;
       if(remainingSeconds <= 0) {
         t.Stop(); 
         toolStripStatusLabel1.Text = "Done!";
         return;
       }
       toolStripStatusLabel1.Text = string.Format("{0} seconds remaining...", remainingSeconds);
    }
}
于 2013-08-01T22:33:54.537 回答