2

別のスレッドでタイマー間隔を変更したい:

    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());
       }
    }

しかし、新しいスレッドで間隔を変更すると、タイマーが停止します。エラーはありません。タイマーは停止します。なぜこれが起こっているのですか、どうすれば修正できますか?

どうも

4

2 に答える 2

1

これを試してみてください。試してみたらうまくいきました。新しい間隔を 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());
    }
于 2012-10-10T20:36:11.153 に答える
0

前の回答に加えて、フォームを使用していないため、System.Windows.Forms.Timer を System.Timers.Timer に変更してみてください。Tick ではなく Elapsed Event があることに注意してください。コードは次のとおりです。

System.Timers.Timer timer = new System.Timers.Timer();
    public Context() {
        timer.Interval = 1;
        timer.Elapsed += new System.Timers.ElapsedEventHandler(timer_Elapsed);   

        timer.Start();
        Thread t = new Thread(ChangeTimerTest);
        t.Start();
    }

    void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
    {
        System.Diagnostics.Debug.WriteLine(System.DateTime.Now.ToLongTimeString());
    }

    private void ChangeTimerTest() {
        System.Diagnostics.Debug.WriteLine("thread run");
        timer.Interval = 2000;
    }

これが最終的に役立つことを願っています!

于 2012-10-10T22:00:17.493 に答える