在第二次通话时重置计时器

时间:2014-06-30 11:46:27

标签: c# multithreading timer

我在这里有点新...并且学习Threading.Timer ...我在Window Service中有一个计时器,它在16:48:00启动一个功能..我只想在21:00再次启动计时器:00 PM ...然后22:00:00 ...时间段之间没有固定计时器间隔

这是我的代码,我试过:

  public partial class ASMSService1 : ServiceBase
    {
        private Timer myTimer;
        private DateTime inputDate;
        private DateTime yesterday;
        private DateTime today;

        public ASMSService1()
        {
            InitializeComponent();

        }

        protected override void OnStart(string[] args)
        {

            inputDate = DateTime.Today;
            today = DateTime.Today;
            yesterday = today.AddDays(-1);

         //time is Set here
            SetTimer(16, 48, 00);

        }


        private void SetTimer(int hours, int minutes, int seconds)
        {
            inputDate = DateTime.Today.AddHours(hours).AddMinutes(minutes).AddSeconds(seconds);
            String date1 = inputDate.TimeOfDay.ToString();
            if (DateTime.Now > inputDate)
            {
                inputDate = inputDate.AddDays(1);
            }

       if (date1.CompareTo("16:48:00") == 0)
        {
            myTimer = new System.Threading.Timer(new TimerCallback(FirstSlotOperations));
            myTimer.Change((int)(inputDate - DateTime.Now).TotalMilliseconds, Timeout.Infinite);
        }


        }


        private void FirstSlotOperations(object e)
        {
         //some operation    
         //Need to reset the Timer at 21:00:00

                     }


    }

我找到了timer.change来自MSDN文章..但我不知道如何在我的情况下实现它

我已经尝试过Thread.sleep()..但是如果可能的话我也在寻找替代方案.. 任何建议都会有帮助

2 个答案:

答案 0 :(得分:1)

我认为Artyom Kharlamov是对的,如果您提供有关您打算实现的具体功能的更多详细信息,则有更好的机会获得更接近您需要的答案。

我对你目前所呈现的内容的看法:

  1. 如果您希望服务在一天中的时间等于预定义值(例如根据您提供的代码的16:48)执行特定操作,我认为您的方法有点复杂,因为您可以实现使用Scheduled Tasks可以更轻松,这也将涵盖您尝试在服务中执行操作的情况,而不是在一天中的特定时间,而是每隔x个时间。
  2. 计时器对象似乎没有公开任何属性或方法,它会告诉你自第一次开始计时以来已经消耗了多少时间,因为你可以使用属性并在调用SetTimer时获取当前时间,设置ASMSService1类中的属性,并在调用FirstSlotOperations时获取与当前时间的差异。
  3. 也许这并不是你想要做的事情,但除非你对你的期望有所了解,否则很难有效地解决这些问题。

答案 1 :(得分:0)

您不需要任何对象来获取当前时间。只需使用:

private void FirstSlotOperations(object e)
{
    DateTime current = DateTime.Now;       
}

在回调函数中作为参数传递的对象是timer对象,因此您无法从中获取数据。例如,您只能使用它来操作计时器对象。

private void FirstSlotOperations(object e)
{
    Timer t = e as Timer;
    t.Change(1000, 0);
}