计时器是否可以通过回调来停止正在运行的线程?
我需要一个能在一定时间内运行某些功能的计时器。但是这个功能比计时器更长。
_timer = new System.Threading.Timer(new TimerCallback(Process), null, TimeSpan.Zero, TimeSpan.FromHours(1));
和回调:
public void Process(Object stateinfo)
{
DateTime dt = DateTime.Now.ToUniversalTime();
//run once a day between 2 and 5 am
if (LastCheckDateTime == DateTime.Today || dt.ToString("HHmm").CompareTo("0200") < 0 || dt.ToString("HHmm").CompareTo("0500") > 0)
return;
try
{
LastCheckDateTime = DateTime.Today;
foo(); //lasts 4 hours
}
catch (Exception ex)
{
LastCheckDateTime = DateTime.MinValue;
//if some problems, Process must start again until 5 am
}
}
此代码于今天凌晨2:56开始,但没有完成,这是因为早上5点还在运行吗?
如何解决这个问题?
答案 0 :(得分:2)
您的代码有效,您在我的脑海中使用了最好的Timer(System.Threading)。 即使先前的调用没有完成,重新执行相同的方法也没有问题。之前的实例没有被杀死。 你只需要管理重入,但你这样做可以防止出现问题(你的计时器会每小时触发一次,因此在检查'LastCheckDateTime'的行与改变其值的行之间没有线程问题。)
我尝试了以下哪种方法效果很好:事件每秒都会触发,但“进程”以3秒等待开始。
public partial class MainWindow : Window
{
private System.Threading.Timer _timer;
public MainWindow()
{
InitializeComponent();
_timer = new Timer(new System.Threading.TimerCallback(Process), null, TimeSpan.Zero, TimeSpan.FromSeconds(1));
}
private void Process(object state)
{
DateTime dt = DateTime.Now;
System.Threading.Thread.Sleep(3000);
Debug.WriteLine("dt=" + dt.ToString("HH:mm:ss.fff") + " Now=" + DateTime.Now.ToString("HH:mm:ss.fff"));
}
}
致以最诚挚的问候,