System.Threading.Timer使用注意的地方
System.Threading.Timer :
提供以指定的时间间隔执行方法的机制。 此类不能被继承。
其中一个构造方法:
public Timer(
TimerCallback callback,
Object state,
long dueTime,
long period
)
参数
callback类型:System.Threading.TimerCallback
一个 TimerCallback 委托,表示要执行的方法。
state类型:System.Object
一个包含回调方法要使用的信息的对象,或者为 null。
dueTime类型:System.Int64
调用 callback 之前延迟的时间量(以毫秒为单位)。指定 Timeout.Infinite 可防止启动计时器。指定零 (0) 可立即启动计时器。
period类型:System.Int64
调用 callback 的时间间隔(以毫秒为单位)。指定 Timeout.Infinite 可以禁用定期终止。--摘自 msdn :http://msdn.microsoft.com/zh-cn/library/vstudio/saba8ksx.aspx在具体使用中需要注意的其备注:(1)如果希望将 Timer 对象本身用作状态对象,可调用此构造函数。创建计时器后,使用 Change 方法设置间隔时间和到期时间。
(2)只要在使用 Timer,就必须保留对它的引用。对于任何托管对象,如果没有对 Timer 的引用,计时器会被垃圾回收。即使 Timer 仍处在活动状态,也会被回收。
(3)当不再需要计时器时,请使用 Dispose 方法释放计时器持有的资源。请注意,回调可能发生在 Dispose() 方法的重载被调用之后,因为计时器是按线程池线程来安排回调的执行的。可使用 Dispose(WaitHandle) 方法重载进行等待,直到完成所有的回调。
(4)由计时器执行的回调方法应该是可重入的,因为它是在 ThreadPool 线程上调用的。在以下两种情况中,此回调可以同时在两个线程池线程上执行:一是计时器间隔小于执行此回调所需的时间;二是所有线程池线程都在使用,此回调被多次排队。
--摘自 msdn:http://msdn.microsoft.com/zh-cn/library/vstudio/system.threading.timer.aspx
根据这些注意项(1)(2)如此使用Timer:
class Program
{
public static int RunTimes = 0;
static void Main(string[] args)
{
Timer t = new Timer(StartCrawl);
//change会重启timer ,
t.Change(0, 3*1000);
//主线程阻塞,防止timer被回收(只要在使用 Timer,就必须保留对它的引用。)
Thread.Sleep(3000 * 1000);
Console.ReadKey();
}
public static void StartCrawl(object stateInfo)
{
/**
* do something here
**/
//change next loop
Timer t = stateInfo as Timer;
if (RunTimes == 0)
{
t.Change(10 * 100, 10 * 1000);// 第1次为重启timer,之后按每10秒执行 time
}
Console.WriteLine(string.Format( "Crawling:{0}",RunTimes++));
}
}
System.Threading.Timer :
提供以指定的时间间隔执行方法的机制。 此类不能被继承。
其中一个构造方法:
public Timer(
TimerCallback callback,
Object state,
long dueTime,
long period
)
参数
callback类型:System.Threading.TimerCallback
一个 TimerCallback 委托,表示要执行的方法。
state类型:System.Object
一个包含回调方法要使用的信息的对象,或者为 null。
dueTime类型:System.Int64
调用 callback 之前延迟的时间量(以毫秒为单位)。指定 Timeout.Infinite 可防止启动计时器。指定零 (0) 可立即启动计时器。
period类型:System.Int64
调用 callback 的时间间隔(以毫秒为单位)。指定 Timeout.Infinite 可以禁用定期终止。--摘自 msdn :http://msdn.microsoft.com/zh-cn/library/vstudio/saba8ksx.aspx在具体使用中需要注意的其备注:(1)如果希望将 Timer 对象本身用作状态对象,可调用此构造函数。创建计时器后,使用 Change 方法设置间隔时间和到期时间。
(2)只要在使用 Timer,就必须保留对它的引用。对于任何托管对象,如果没有对 Timer 的引用,计时器会被垃圾回收。即使 Timer 仍处在活动状态,也会被回收。
(3)当不再需要计时器时,请使用 Dispose 方法释放计时器持有的资源。请注意,回调可能发生在 Dispose() 方法的重载被调用之后,因为计时器是按线程池线程来安排回调的执行的。可使用 Dispose(WaitHandle) 方法重载进行等待,直到完成所有的回调。
(4)由计时器执行的回调方法应该是可重入的,因为它是在 ThreadPool 线程上调用的。在以下两种情况中,此回调可以同时在两个线程池线程上执行:一是计时器间隔小于执行此回调所需的时间;二是所有线程池线程都在使用,此回调被多次排队。
--摘自 msdn:http://msdn.microsoft.com/zh-cn/library/vstudio/system.threading.timer.aspx
根据这些注意项(1)(2)如此使用Timer:
class Program
{
public static int RunTimes = 0;
static void Main(string[] args)
{
Timer t = new Timer(StartCrawl);
//change会重启timer ,
t.Change(0, 3*1000);
//主线程阻塞,防止timer被回收(只要在使用 Timer,就必须保留对它的引用。)
Thread.Sleep(3000 * 1000);
Console.ReadKey();
}
public static void StartCrawl(object stateInfo)
{
/**
* do something here
**/
//change next loop
Timer t = stateInfo as Timer;
if (RunTimes == 0)
{
t.Change(10 * 100, 10 * 1000);// 第1次为重启timer,之后按每10秒执行 time
}
Console.WriteLine(string.Format( "Crawling:{0}",RunTimes++));
}
}
浙公网安备 33010602011771号