18

我的代码中有一个Windows.Forms.Timer,我正在执行 3 次。但是,计时器根本没有调用 tick 函数。

private int count = 3;
private timer;
void Loopy(int times)
{
    count = times;
    timer = new Timer();
    timer.Interval = 1000;
    timer.Tick += new EventHandler(timer_Tick);
    timer.Start();
}

void timer_Tick(object sender, EventArgs e)
{
    count--;
    if (count == 0) timer.Stop();
    else
    {
        // Do something here
    }
}

Loopy()正在从代码中的其他地方调用。

4

8 回答 8

52

尝试使用 System.Timers 而不是 Windows.Forms.Timer

void Loopy(int times)
{
    count = times;
    timer = new Timer(1000);
    timer.Enabled = true;
    timer.Elapsed += new ElapsedEventHandler(timer_Elapsed);
    timer.Start();
}

void timer_Elapsed(object sender, ElapsedEventArgs e)
{
    throw new NotImplementedException();
}
于 2012-11-16T07:33:25.777 回答
8

如果在不是主 UI 线程的线程中调用 Loopy() 方法,则计时器不会计时。如果您想从代码中的任何位置调用此方法,则需要检查该InvokeRequired属性。所以你的代码应该是这样的(假设代码是一个表单):

        private void Loopy(int times)
        {
            if (this.InvokeRequired)
            {
                this.Invoke((MethodInvoker)delegate
                {
                    Loopy(times);
                });
            }
            else
            {
                count = times;
                timer = new Timer();
                timer.Interval = 1000;
                timer.Tick += new EventHandler(timer_Tick);
                timer.Start();
            }
        }
于 2015-05-04T15:06:14.307 回答
2

我不确定你做错了什么,它看起来是正确的,这段代码有效:看看它与你的比较如何。

public partial class Form1 : Form
{
    private int count = 3;
    private Timer  timer;

    public Form1()
    {
        InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        Loopy(count);
    }

    void Loopy(int times)
    {
        count = times;
        timer = new Timer();
        timer.Interval = 1000;
        timer.Tick += new EventHandler(timer_Tick);
        timer.Start();
    }

    void timer_Tick(object sender, EventArgs e)
    {
        count--;
        if (count == 0) timer.Stop();
        else
        {
            //
        }
    } 

}
于 2012-11-16T07:33:11.573 回答
2

这是一个有效的Rx代码:

Observable.Interval(TimeSpan.FromSeconds(1))
.Take(3)
.Subscribe(x=>Console.WriteLine("tick"));

当然,您可以在您的程序中订阅更有用的内容。

于 2012-11-16T07:34:25.017 回答
1

如果您使用的是 Windows.Forms.Timer,则应使用以下内容。

//Declare Timer
private Timer _timer= new Timer();

void Loopy(int _time)
{

    _timer.Interval = _time;
    _timer.Enabled = true;
    _timer.Tick += new EventHandler(timer_Elapsed);
    _timer.Start();
}

void timer_Elapsed(object sender, EventArgs e)
{
    //Do your stuffs here
}
于 2018-09-20T06:45:42.430 回答
1

检查您的属性中的计时器是否已启用。我的是假的,设置为真后它起作用了。

于 2020-07-09T07:09:20.737 回答
0

如果你使用一些小于定时器内部间隔的延迟,system.timer 将执行其他线程,你必须处理同时运行的双线程。应用 InvokeRequired 来控制流程。

于 2020-11-21T05:04:25.887 回答
0

您可能已经从另一个线程启动了计时器,因此请尝试从正确的线程调用它。 例如,而不是:

timerX.start();

利用:

Invoke((MethodInvoker)delegate { timerX.Start(); });
于 2021-12-31T09:56:00.837 回答