我可以更有效地使用System.Threading.Timer

时间:2013-04-25 17:23:13

标签: c# timer windows-services autoresetevent

我正在寻找一些关于提高代码效率的建议。我想做的是让System.Threading.Timer每小时左右运行一些工作,工作不会很重,但我希望有一个不需要太多资源的代码。我计划在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.
    }
}

你们觉得怎么样?我可以提高我的代码效率吗?

非常感谢所有建议!

3 个答案:

答案 0 :(得分:4)

总分:

  • 您不必每小时创建一个新计时器。
  • 将第二个参数设置为无限,您必须手动重新加载计时器。但是......在这种情况下,你为什么要这样做?
  • 你做了一个艰难的计算,从现在的一小时开始创建一个时间跨度:现在+ 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");
    }
}

答案 1 :(得分:1)

这并不好,因为您每次迭代都会创建并放弃一个全新的计时器。移动

timer = new Timer(Write);

进入Main以便它只执行一次,然后SetTimer可以重复使用这个Timer对象。

答案 2 :(得分: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
}