C# System.Threading.Timer是否停止线程?
计时器可以通过回调返回来停止正在运行的线程吗 我需要一个定时器,它将在一定时间内运行一些功能。但此功能的持续时间超过计时器的滴答声C# System.Threading.Timer是否停止线程?,c#,timer,C#,Timer,计时器可以通过回调返回来停止正在运行的线程吗 我需要一个定时器,它将在一定时间内运行一些功能。但此功能的持续时间超过计时器的滴答声 _timer = new System.Threading.Timer(new TimerCallback(Process), null, TimeSpan.Zero, TimeSpan.FromHours(1)); 和回调: public void Process(Object stateinfo) { DateTime dt = DateTime.No
_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
}
}
公共作废流程(对象状态信息)
{
DateTime dt=DateTime.Now.ToUniversalTime();
//每天在凌晨2点到5点之间跑步一次
如果(LastCheckDateTime==DateTime.Today | dt.ToString(“HHmm”).CompareTo(“0200”)<0 | dt.ToString(“HHmm”).CompareTo(“0500”)>0)
返回;
尝试
{
LastCheckDateTime=DateTime.Today;
foo();//持续4小时
}
捕获(例外情况除外)
{
LastCheckDateTime=DateTime.MinValue;
//如果出现一些问题,必须重新启动该过程,直到凌晨5点
}
}
这段代码在今天凌晨2:56开始,但没有完成,这是因为在凌晨5点它仍在运行吗
如何解决这个问题?您的代码运行正常,您使用了我心目中最好的计时器(System.Threading)。 即使上一次调用没有完成,也可以重新执行相同的方法。前一个实例未被终止。 您只需要管理可重入性,但您这样做可以防止出现问题(计时器每小时启动一次,因此检查“LastCheckDateTime”的行和更改其值的行之间没有线程问题) 我尝试了以下方法,效果很好:事件每秒触发一次,但“进程”以3s等待开始
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"));
}
}
致以最诚挚的问候,如果持续时间超过一个计时器滴答声,您想中止该操作吗?不,这没问题,我只想让它在2点开始,如果出现问题,则重新启动到5点。您所说的“直到5点”是什么意思?如果需要超过3小时,那么重新启动它?为什么不使用一种简单的机制,例如在方法启动时填充会话变量,并在方法停止时清除变量。。。然后在计时器中,如果会话变量已填充,则运行时间不要超过3小时,停止并重试。。。或者类似的。不,如果需要超过3个小时,我不想重新启动它,除非它捕获到异常。非常感谢您的回复,我只想问asc这是否是使用睡眠的良好实践?程序中还有另外一些线程也使用睡眠,但它们是通过线程实现的:new Thread(new ThreadStart(this.Process));我仍然不明白为什么foo()毫无例外地停止了,有什么可以阻止它呢?Timer不能这样做?事实上,你是对的,Thread.Sleep()根本不是一个好的做法。但它对我来说真的很有用。在我看来,对于“真正的代码”,使用计时器或异步代码(BackgroundWorker、events、IAsyncResult、Task)处理延迟总是可能的。