2012-08-12 54 views
1

有没有一种方法可以用一个给定的动作构建一个新的定时器,但是从一开始就告诉它必须在一个小时后自行终止? (它可以自己工作或我需要另一条线来处理?)只需要一个定时器,用于应用程序生命周期的第一个小时

+3

这是WinForms? WPF?还有别的吗?你使用什么计时器?你可以发布你的一些代码吗? – 2012-08-12 08:33:45

+0

我有两个性能计数器。每秒更新一个,但另一个每小时更新一次。所以,在第一个小时看到一部分计数器为零并不是很好。考虑到纯粹的C#4.0问题 - 我如何计时一个动作,并确保一小时后停止它?我不想自己开始管理它... – user1025852 2012-08-12 08:40:56

回答

1

我会使用两个计时器,一个做任何你想要的,另一个杀死一小时后的第一个计时器。

以下是两个示例,每个示例都使用1秒钟的主定时器,需要在第5秒钟后终止。

如果您正在使用System.Threading.Timer

Timer actualTimer = new Timer(obj => Console.WriteLine("Timer!"), 
    null, 0, 1000); 

Timer killingTimer = new Timer(obj => 
{ 
    Console.WriteLine("Killing timer!"); 
    // Set the dueTime and timeout to infinite, to stop the timer. 
    actualTimer.Change(Timeout.Infinite, Timeout.Infinite); 
    killingTimer.Change(Timeout.Infinite, Timeout.Infinite); 
}, null, 5000, 5000); 

Console.ReadLine(); 

如果您正在使用System.Timers.Timer

Timer actualTimer = new Timer(); 
actualTimer.Interval = 1000; 
actualTimer.Elapsed += (sender, e) => Console.WriteLine("Timer!"); 
actualTimer.Start(); 

Timer killingTimer = new Timer(); 
killingTimer.Interval = 5000; 
killingTimer.Elapsed += (sender, e) => 
{ 
    Console.WriteLine("Killing timer!"); 
    actualTimer.Stop(); 
    killingTimer.Stop(); 
}; 
killingTimer.Start(); 

时间以毫秒(1000秒)。根据this postSystem.Threading.Timer是优选的,但System.Timers.Timer适用于根据this post可以从不同线程调用定时器的方法的情况。

+0

你也想杀死杀戮者! – usr 2012-08-12 12:00:26

+0

谢谢Virtlink和usr。它工作,它是一个整洁的解决方案(我希望它是在构造函数 - 但这也是很好的) – user1025852 2012-08-12 12:25:22

+0

另一个问题 - 我应该期待同步问题?例如杀死计时器会杀死某些关键部分中的实际计时器,并抛出异常? – user1025852 2012-08-12 13:38:39

相关问题