C# 计时器滴答声不是';尽管计时器启动,但未触发。

C# 计时器滴答声不是';尽管计时器启动,但未触发。,c#,winforms,timer,C#,Winforms,Timer,计时器将不会罚单我可以找出原因,我已经包括了代码的各个部分 using Timer = System.Windows.Forms.Timer; 然后在我的班级里(内部密封) 宣布 private int _timeLeft; Timer _countDownTimer = new Timer(); private int _scriptsLeftCount; 然后内法 _timeLeft = timeToStart; _countDownTimer.

计时器将不会罚单我可以找出原因,我已经包括了代码的各个部分

using Timer = System.Windows.Forms.Timer;
然后在我的班级里(内部密封)

宣布

 private int _timeLeft;
    Timer _countDownTimer = new Timer();
    private int _scriptsLeftCount;
然后内法

_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();
        }
    }

然而,它似乎没有做任何滴答声。因此,如果不运行restore,任何指针都会有所帮助

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

也就是说,你不应该这么做。后台工作人员不需要等待一定的时间段;如果您有一些事情是以定时间隔发生的,那么您可以在主线程中设置一个计时器,并在触发时启动新的工作项。如果要在后台工作程序中等待输入,可以使用阻塞I/O调用。如果需要等待其他项目完成,请使用EventWaitHandles(手动或自动resetEvents)

但话虽如此,

如果要重复执行某些操作,只需在backgroundworker DoWork()方法中使用一个循环即可

如果需要大于1秒的延迟,则必须稍微更改循环,以便检测辅助进程是否已关闭:

int delay = 1000; // 1 second
    int interval = 60000;
    int elapsed = 0;
    while (!worker.CancellationPending)
    {
        elapsed = 0;
        do {
          Thread.Sleep(delay);
        }
        while (elapsed < interval && !worker.CancellationPending);
    }
    e.Cancel = true;
int delay=1000;//1秒
整数区间=60000;
int=0;
而(!worker.CancellationPending)
{
经过=0;
做{
睡眠(延迟);
}
while(经过
您是否在某个地方将“timeleft”设置为正值?我在拉入的配置中将“timeleft”设置为正值,我还尝试了
\u countDownTimer.Enabled=true都不工作使用调试器。在Start()调用上设置一个断点,并确保调试器在其上中断,以便您知道它正在被调用。然后使用Debug>Windows>Threads并确保此代码正在UI线程上运行。当它在工作线程上运行时无法工作。这些都不是您可以忽略的细节。这也不是你问的问题。OP的问题与他没有遇到的事情有关,特别是在UI和工作线程中。。
int delay = 1000; // 1 second
    int interval = 60000;
    int elapsed = 0;
    while (!worker.CancellationPending)
    {
        elapsed = 0;
        do {
          Thread.Sleep(delay);
        }
        while (elapsed < interval && !worker.CancellationPending);
    }
    e.Cancel = true;