更改其他线程中的计时器间隔

时间:2012-10-10 20:23:21

标签: c# .net

我想在另一个帖子中更改计时器间隔:

    class Context : ApplicationContext {
       private System.Windows.Forms.Timer timer = new System.Windows.Forms.Timer();
       public Context() {
           timer.Interval = 1;
           timer.Tick += timer_Tick;
           timer.Start();
           Thread t = new Thread(ChangeTimerTest);
           t.Start();
       }
       private void ChangeTimerTest() {
           System.Diagnostics.Debug.WriteLine("thread run");
           timer.Interval = 2;
       }
       private void timer_Tick(object sender,EventArgs args) {
           System.Diagnostics.Debug.WriteLine(System.DateTime.Now.ToLongTimeString());
       }
    }

但是当我更改新线程中的间隔时,计时器停止。没有错误,计时器就停止了。 为什么会发生这种情况?我该如何解决?

THX

1 个答案:

答案 0 :(得分:0)

尝试这个,我尝试了它并且它有效,我只将新间隔从2更改为2000毫秒,这样您就可以看到输出的差异。 您必须以线程安全的方式更改间隔,因为计时器位于UI线程上下文中。在这些情况下,建议使用代表。

private System.Windows.Forms.Timer timer = new System.Windows.Forms.Timer();
    public void Context() {
        timer.Interval = 1;
        timer.Tick += timer_Tick;
        timer.Start();
        Thread t = new Thread(ChangeTimerTest);
        t.Start();
    }
    delegate void intervalChanger();
    void ChangeInterval()
    {
        timer.Interval = 2000;
    }
    void IntervalChange()
    {
        this.Invoke(new intervalChanger(ChangeInterval));
    }
    private void ChangeTimerTest() {
        System.Diagnostics.Debug.WriteLine("thread run");
        IntervalChange();
    }
    private void timer_Tick(object sender,EventArgs args) {
        System.Diagnostics.Debug.WriteLine(System.DateTime.Now.ToLongTimeString());
    }