计时器在禁用后不想再次启动

时间:2014-02-04 11:57:03

标签: c# multithreading timer

我正在编写一个简单的C#程序,尝试使用System.Forms.Timer每隔x秒执行一次操作

tick事件调用一个方法来启动一个新线程并禁用定时器,然后当线程完成其工作时,它再次启用定时器,但问题是,现在它在启用后没有打勾

static System.Windows.Forms.Timer testtimer = new System.Windows.Forms.Timer();

    static void Main()
    {
        testtimer.Tick += testtimertick;
        testtimer.Interval = 5000;
        testtimer.Enabled = true;
        testtimer.Start();

        while (true)
        {
            Application.DoEvents();  //Prevents application from exiting
        }

    }

 private static void testtimertick(object sender, System.EventArgs e)
    { 

            testtimer.Enabled = false;
            Thread t = new Thread(dostuff);
            t.Start();
    }


private static void dostuff()
    {

       //Executes some code
       testtimer.Enabled = true; //Re enables the timer but it doesn't work
       testtimer.Start();
     }

6 个答案:

答案 0 :(得分:3)

不使用没有GUI的GUI计时器。不要与DoEvents一起旋转,因为你正在使用它来燃烧100%的CPU核心。使用System.Threading.Timer。它会起作用。

答案 1 :(得分:2)

您可以使用System.Threading.Timer执行您想要执行的操作,使用Change Method设置时间和句点,只需在完成工作后重新启动即可。

class Program
{
    static System.Threading.Timer testtimer;
    static void Main(string[] args)
    {
        testtimer = new System.Threading.Timer(testtimertick);
        testtimer.Change(5000,0);

        Console.ReadLine();
    }

    private static void testtimertick(object sender)
    {

        Thread t = new Thread(dostuff);
        t.Start();
    }


    private static void dostuff()
    {

        //Executes some code
        Thread.Sleep(2000);
        Console.WriteLine("Tick");
        testtimer.Change(5000, 0);
    }
}

答案 2 :(得分:1)

Windows窗体控件不是线程安全的,您应该确保在UI线程上使用它们,请参阅例如C# Windows Forms Application - Updating GUI from another thread AND class?

答案 3 :(得分:1)

static System.Windows.Forms.Timer testtimer = new System.Windows.Forms.Timer();

    static void Main()
    {
        testtimer.Tick += testtimertick;
        testtimer.Interval = 5000;
        testtimer.Enabled = true;

        while (true)
        {
            Application.DoEvents();  //Prevents application from exiting
        }

    }

 private static void testtimertick(object sender, System.EventArgs e)
    { 

            Thread t = new Thread(dostuff);
            t.Start();
    }


private static void dostuff()
    {
       testtimer.Enabled = false;
       //Executes some code
       testtimer.Enabled = true; //Re enables the timer but it doesn't work
       testtimer.Start();
     }

答案 4 :(得分:0)

我刚才有类似的问题。我正在禁用计时器并在需要时再次启用。 下次启用时,它将无效。

我想在每次要启用时禁用和创建新实例时尝试处理Timer对象。虽然没用。

然后找出解决方案。我正在删除在testtimer.Tick中配置的事件,然后在我想启用计时器时将其添加回来。

因此,内部的计时器将始终使用有效值进行实例化,并使其属性Enabled = true。唯一的区别是,只要滴答事件触发,它就不会有任何实际执行的内容。

这会模仿禁用和启用计时器,并使其像你控制的那样工作,如Enabled = false / true。

答案 5 :(得分:0)

如果你真的想坚持GUI计时器,并从非UI线程启动它,你可以尝试做类似的事情,然后从非UI线程写入GUI。

我知道,这不是理想的解决方案。

this.Invoke((MethodInvoker)delegate
{
    refreshTimer.Enabled = true;
    refreshTimer.Start();
});