【发布时间】:2014-11-14 08:55:42
【问题描述】:
计时器能否通过回调返回来停止正在运行的线程?
我需要一个计时器,它会在一定时间内运行某些功能。但是这个函数的持续时间超过了计时器滴答声。
_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 点它还在运行吗?
以及如何解决这个问题?
【问题讨论】:
-
如果持续时间超过一个计时器,您想中止操作吗?
-
不,没关系,我只是希望它从 2 点开始,如果出现问题则重新启动到 5 点。
-
“直到 5” 是什么意思?如果需要超过 3 小时,则重新启动它?
-
为什么不只使用一个简单的机制,例如使用方法启动的时间填充会话变量,并在它停止时清除变量......然后在你的计时器中,如果会话变量被填充不要'不要运行超过 3 小时前停止它并重试...或类似的东西。
-
不,如果超过 3 小时,我不想重新启动它,除非它捕获到异常。