尽管定时器启动,但不会触发定时器滴答。

时间:2015-07-22 07:43:08

标签: c# winforms timer

计时器赢了票我可以弄清楚为什么,我已经包含了代码的各个部分。

using Timer = System.Windows.Forms.Timer;

然后在我的课堂内(内部密封)

声明

 private int _timeLeft;
    Timer _countDownTimer = new Timer();
    private int _scriptsLeftCount;

然后在Method

_timeLeft = timeToStart;
            _countDownTimer.Tick += CountDownTimer_Tick;
            _countDownTimer.Interval = 60000;
            _countDownTimer.Start();

    private void CountDownTimer_Tick(object sender, EventArgs e)
    {
        Console.WriteLine("Tick " + _timeLeft);
        if (_timeLeft > 0)
        {
            // Display the new time left 
            // by updating the Time Left label.
            _timeLeft = _timeLeft - 1;
            WriteMessage(_timeLeft + " Minutes" + Environment.NewLine);
        }
        else
        {
            _countDownTimer.Stop();
            Restore();
        }
    }

但它似乎没有做任何勾选。暂时没有运行恢复,任何指针都会有所帮助。

1 个答案:

答案 0 :(得分:2)

它不起作用的原因是WinForms计时器在UI线程中运行,而后台工作程序在后台线程中运行。

那就是说,你不应该这样做。后台工作者不应该等待定时时间;如果你有定时发生的事情,你可以在主线程中有一个计时器,并在它发生时启动新的工作项。如果要等待后台工作程序中的输入,可以使用阻止I / O调用。如果需要等待其他项目完成,请使用EventWaitHandles(Manual-或AutoResetEvents)。

然而,话虽如此,

如果你想反复做某事,你应该在backgroundworker DoWork()方法中使用一个循环。

div

如果您需要超过1秒的延迟,您的循环必须稍微更改以允许您检测工作人员是否已关闭:

private void DoWork(object sender, DoWorkEventArgs e)
{
    BackgroundWorker worker = sender as BackgroundWorker;
    int delay = 1000; // 1 second
    while (!worker.CancellationPending)
    {
        do something
        Thread.Sleep(delay);
    }
    e.Cancel = true;
}