9

このタイマーのコールバック関数からSystem.Threading.Timerの間隔を変更するにはどうすればよいですか?これは正しいです?

そうする。起こらなかった。

public class TestTimer
{
    private static Timer _timer = new Timer(TimerCallBack); 

    public void Run()
    {
        _timer.Change(TimeSpan.Zero, TimeSpan.FromMinutes(1));
    }

    private static void TimerCallBack(object obj)
    {
        if(true)
            _timer.Change(TimeSpan.Zero, TimeSpan.FromMinutes(10));
    }

}
4

2 に答える 2

13

この行は無限再帰を生成します:

if(true)
    _timer.Change(TimeSpan.Zero, TimeSpan.FromMinutes(10));

TimerCallBack最初のパラメーターは、すぐに実行することを強制します。そのため、無期限に何度も実行されます。

修正は

if(true)
    _timer.Change(TimeSpan.FromMinutes(10), TimeSpan.FromMinutes(10));
于 2011-05-25T05:31:03.787 に答える
5

問題は、 への呼び出しで、次の呼び出しがすぐにChange発生するように指定されていることです。毎回呼び出す場合は、ピリオド(-1 の定数) を使用して、次回以降はまったく繰り返さないように指示することができますが、それでも発火し続けます。時間、あなたはそれをリセットします。例えば:Change Timeout.Infinite

using System;
using System.Threading;

static class Program
{
    private static Timer timer = new Timer(TimerCallBack); 

    public static void Main()
    {
        timer.Change(TimeSpan.Zero, TimeSpan.FromSeconds(1));
        Thread.Sleep(10000);

    }

    private static void TimerCallBack(object obj)
    {
        Console.WriteLine("{0}: Fired", DateTime.Now);
        timer.Change(TimeSpan.FromSeconds(3),
                     TimeSpan.FromMilliseconds(Timeout.Infinite));
    }
}

または、一度だけ変更してそのままにしておくこともできます。

using System;
using System.Threading;

static class Program
{
    private static Timer timer = new Timer(TimerCallBack); 
    private static bool changed = false;

    public static void Main()
    {
        timer.Change(TimeSpan.Zero, TimeSpan.FromSeconds(1));
        Thread.Sleep(10000);

    }

    private static void TimerCallBack(object obj)
    {
        Console.WriteLine("{0}: Fired", DateTime.Now);
        if (!changed)
        {
            changed = true;
            TimeSpan interval = TimeSpan.FromSeconds(3);
            timer.Change(interval, interval);
        }
    }
}

どちらの場合も、最初の間隔 (上記のサンプルでは 1 秒) を使用していないことに注意してください。これは、ChangeすぐにTimeSpan.Zero呼び出すためChangeです。

于 2011-05-25T05:31:59.437 に答える