-2

コードをより効率的にするためのアドバイスを探しています。私がやりたいことは、System.Threading.Timer1 時間ごとに何らかのジョブを実行することです。ジョブはそれほど重くはなりませんが、リソースをあまり消費しないコードが必要です。このコードを Windows サービスで実行する予定です。

これは私がこれまでに持っているものです。

class Program
{
    private static Timer timer;

    static void Main(string[] args)
    {
        SetTimer();
    }

    static void SetTimer()
    {
        timer = new Timer(Write);

        var next = DateTime.Now.AddHours(1);

        var nextSync = (int)(next - DateTime.Now).TotalMilliseconds;

        timer.Change(nextSync, Timeout.Infinite);
    }

    static void Write(object data)
    {
        Console.WriteLine("foo");

        SetTimer(); //Call the SetTimer again for the next run.
    }
}

皆さんはどう思いますか?コードをより効率的にすることはできますか?

すべてのアドバイスは大歓迎です!

4

3 に答える 3

5

いくつかのポイント:

  • 1 時間ごとに新しいタイマーを作成する必要はありません。
  • 2 番目のパラメーターを無限に設定すると、タイマーを手動でリロードする必要があります。しかし... この場合、なぜあなたはすべきでしょうか?
  • 現在の 1 時間からタイムスパンを作成するのは難しい計算です: 現在 + 1 時間 - 現在。これは簡単に解決できます。

これを試して:

class Program
{
    private static Timer timer = new Timer(Write, null, TimeSpan.FromHours(1), TimeSpan.FromHours(1));

    static void Main(string[] args)
    {
    }

    static void Write(object data)
    {
        Console.WriteLine("foo");
    }
}
于 2013-04-25T17:27:26.253 に答える
1

反復ごとに新しいタイマーを作成して破棄するため、これは良くありません。動く

timer = new Timer(Write);

Main一度しか実行されず、SetTimerこの単一の Timer オブジェクトを再利用できます。

于 2013-04-25T17:26:28.503 に答える
0

WPF では:

DispatcherTimer timer = new DispatcherTimer();

timer.Tick += timer_Tick;
timer.Interval = = new TimeSpan(1, 0, 0); //once an hour
timer.Start();

void timer_Tick(object sender, EventArgs e)
{
     //do your updates
}
于 2013-04-25T17:29:29.487 に答える