所以我有一个方法,每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让我知道没有使用计时器,没有特别的原因。
答案 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?,我会说使用秒表可能比我的脏计数器更精确和有效,但说实话,秒表和计时器之间的时间差异最多可以忽略不计,除非你需要比毫秒更好的时间差。