定时器不会打勾

时间:2012-11-16 07:23:27

标签: c# forms timer

我的代码中有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()

7 个答案:

答案 0 :(得分:40)

尝试使用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();
}

答案 1 :(得分:6)

如果在不是主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();
            }
        }

答案 2 :(得分: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
        {
            //
        }
    } 

}

答案 3 :(得分:2)

这是一个有效的Rx代码:

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

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

答案 4 :(得分: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
}

答案 5 :(得分:0)

检查是否在属性中启用了计时器。 我的是假的,设置为真后就可以了。

答案 6 :(得分:0)

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