定时一个方法,每隔N秒重复M小时

时间:2016-06-15 19:17:07

标签: c#

所以我有一个方法,每30秒运行一次最多2个小时。

我的代码是:

private void btnJSON_Click(object sender, RoutedEventArgs e)
{
    Task.Factory.StartNew(() =>
    {
        //Timing Logic
        var geTimerDelay = 2;
        Stopwatch s = new Stopwatch();
        s.Start();
        while (s.Elapsed < TimeSpan.FromHours(geTimerDelay))
        {

            Stopwatch s30 = new Stopwatch();
            s30.Start();
            while (s.Elapsed < TimeSpan.FromSeconds(30))
            {
                //Method To Run
            }
            s30.Stop();
        }
        s.Stop();
    });
}

我是否正确地做到了(正如所提到的那样实现时间差)或者是否有正确的和/或更多时间 - 精确的方法来做到这一点?

我需要知道,因为我是从特定网址访问数据,有时候我会得到空值,可能是由于频繁访问。

感谢。

编辑:This让我知道没有使用计时器,没有特别的原因。

3 个答案:

答案 0 :(得分:2)

如果您要使用StopWatch,那么您需要执行以下操作才能让它在两次运行之间等待30秒。

private void btnJSON_Click(object sender, RoutedEventArgs e)
{
    Task.Factory.StartNew(() =>
    {
        //Timing Logic
        var geTimerDelay = 2;
        Stopwatch s = new Stopwatch();
        s.Start();
        while (s.Elapsed < TimeSpan.FromHours(geTimerDelay))
        {
            Stopwatch s30 = new Stopwatch();
            s30.Start();
            //Method to run
            while (s.Elapsed < TimeSpan.FromSeconds(30))
            {
            }
            s30.Stop();
        }
        s.Stop();
    });
}

但您可以通过调用StopWatch来替换内部Thread.Sleep,并避免加扰CPU。

private void btnJSON_Click(object sender, RoutedEventArgs e)
{
    Task.Factory.StartNew(() =>
    {
        //Timing Logic
        var geTimerDelay = 2;
        Stopwatch s = new Stopwatch();
        s.Start();
        while (s.Elapsed < TimeSpan.FromHours(geTimerDelay))
        {
            //Method to run
            Thread.Sleep(TimeSpan.FromSeconds(30));
        }
        s.Stop();
    });
}

请注意,第二个在运行之间存在30秒的差距。这意味着运行方法所需的时间不包括在运行之间的时间中,与第一个不同。

答案 1 :(得分:1)

  

This给了我一个不使用计时器的想法,没有特别的原因。

Timer对此用例完全有效。链接问题中的问题是秒表与计时器的精确度。你不需要那种精确度(我假设)所以使用Timer没有任何问题。

由于您声称“正在访问特定网址中的数据”,因此延迟的差异可能会通过使用Stopwatch来抵消任何精度提升。

我会专注于找出为什么你得到空值,并决定要对它做些什么。

答案 2 :(得分:1)

private int x = 0;
public Form1 ()
{
    InitializeComponent();
}

private void button1_Click ( object sender, EventArgs e )
{
    InitTimer();
}

private void timer1_Tick ( object sender, EventArgs e )
{
    bool s = IsFinished();
    if (s == true)
        textBox1.Text = "true";
}

private void InitTimer ()
{
    timer1 = new Timer();
    timer1.Tick += new EventHandler(timer1_Tick);
    timer1.Interval = 3000; //30000 is 30 seconds
    timer1.Start();
}
private bool IsFinished ()
{
    if (++x == 2) //1 min
    {
        timer1.Stop();
        return true;
    }
    else return false;
}

这是一种通过计时器和计数控制运行您的函数或方法的快速方法。从How do I measure how long a function is running?,我会说使用秒表可能比我的脏计数器更精确和有效,但说实话,秒表和计时器之间的时间差异最多可以忽略不计,除非你需要比毫秒更好的时间差。