System.Threading.Timer停止线程?

时间:2014-11-14 08:55:42

标签: c# timer

计时器是否可以通过回调来停止正在运行的线程?

我需要一个能在一定时间内运行某些功能的计时器。但是这个功能比计时器更长。

_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点还在运行吗?

如何解决这个问题?

1 个答案:

答案 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"));

    }

}

致以最诚挚的问候,