0

.NET アプリケーションの Threading.Timer に問題があります。分かりやすくするために、サンプルを作りました。

using System;
using System.Diagnostics;
using System.Threading;

namespace TimerTestApp
{
    class Program
    {
        private static Timer timer;
        private static int timerTickCounter;
        private static DateTime timerStartTimer;
        private static readonly Stopwatch Sw = new Stopwatch();
        private static readonly ManualResetEvent TimerFinish = new ManualResetEvent(false);

        static void Main()
        {
            Console.WriteLine("START");
            timer = new Timer(TimerCallBack, null, 0, 1000);
            TimerFinish.WaitOne();
        }

        private static void TimerCallBack(object state)
        {
            if (timerTickCounter == 0)
            {
                timerStartTimer = DateTime.Now;
                Sw.Start();
            }
            timerTickCounter++;
            Console.WriteLine("timerTickCounter = {0}", timerTickCounter);
            if (timerTickCounter >= 1200) //20.00 min
            {
                var secondsSinceStart = (int)(DateTime.Now - timerStartTimer).TotalSeconds;
                timer.Dispose();
                Sw.Stop();
                Console.WriteLine("timerTickCounter = {0}; secondsSinceStart={1}; Stowatchseconds={2}",
                                    timerTickCounter, secondsSinceStart, Sw.Elapsed.TotalSeconds);
                Console.ReadLine();
                TimerFinish.Set();
            }
        }
    }
}

このコードを実行すると、resut を含む最後の行が表示されます。

timerTickCounter = 1200; secondsSinceStart=1215; Stowatchseconds=1215,7573291

タイマーは毎秒刻みますが、結果の出力では、プログラムの実行に 15 秒余分にかかったことが示されています。

フィールドを更新するメカニズムが必要ですがDateTime、1 秒に 1 回作動するタイマーを単純に作成することはできません。

誰でもこれに対する解決策を提案できますか?

4

1 に答える 1

1

すべてのタイマーは ~20ms の分解能で動作します。したがって、20 分の 15 秒は想定範囲内です。

非常に正確な 1/秒タイマーが本当に必要な場合は、ワンショット タイマーを使用して、毎回残りの秒を計算する必要があります。

于 2013-01-05T17:37:32.627 に答える