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)处理延迟总是可能的。