如何从此计时器的回调函数更改System.Threading.Timer中的间隔? 这是对的吗?
这样做。没有发生。
public class TestTimer
{
private static Timer _timer = new Timer(TimerCallBack);
public void Run()
{
_timer.Change(TimeSpan.Zero, TimeSpan.FromMinutes(1));
}
private static void TimerCallBack(object obj)
{
if(true)
_timer.Change(TimeSpan.Zero, TimeSpan.FromMinutes(10));
}
}
答案 0 :(得分:11)
此行生成无限递归:
if(true)
_timer.Change(TimeSpan.Zero, TimeSpan.FromMinutes(10));
第一个参数强制TimerCallBack
立即执行。所以它无限期地一次又一次地执行它。
修复将是
if(true)
_timer.Change(TimeSpan.FromMinutes(10), TimeSpan.FromMinutes(10));
答案 1 :(得分:4)
问题是,您对Change
的调用指定下一次调用应立即发生。如果您要在每个时间拨打Change
,您可以使用Timeout.Infinite
的句点(这只是-1的常量)来告诉它以避免重复在下一次之后完全 - 但它仍将继续射击,因为下次你重置它。例如:
using System;
using System.Threading;
static class Program
{
private static Timer timer = new Timer(TimerCallBack);
public static void Main()
{
timer.Change(TimeSpan.Zero, TimeSpan.FromSeconds(1));
Thread.Sleep(10000);
}
private static void TimerCallBack(object obj)
{
Console.WriteLine("{0}: Fired", DateTime.Now);
timer.Change(TimeSpan.FromSeconds(3),
TimeSpan.FromMilliseconds(Timeout.Infinite));
}
}
或者,您可以只更改一次,然后保留它:
using System;
using System.Threading;
static class Program
{
private static Timer timer = new Timer(TimerCallBack);
private static bool changed = false;
public static void Main()
{
timer.Change(TimeSpan.Zero, TimeSpan.FromSeconds(1));
Thread.Sleep(10000);
}
private static void TimerCallBack(object obj)
{
Console.WriteLine("{0}: Fired", DateTime.Now);
if (!changed)
{
changed = true;
TimeSpan interval = TimeSpan.FromSeconds(3);
timer.Change(interval, interval);
}
}
}
请注意,在任何一种情况下都没有使用初始间隔(上面的示例中为1秒),因为我们立即调用Change
- 如果您真的希望在第一次调用之前有不同的时间,请不要在TimeSpan.Zero
的初始调用中使用Change
。