计时器赢了票我可以弄清楚为什么,我已经包含了代码的各个部分。
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();
}
}
但它似乎没有做任何勾选。暂时没有运行恢复,任何指针都会有所帮助。
答案 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;
}