繁体   English   中英

重设第二个通话计时器

[英]reset the timer on second call

我在这里有点新手,而且正在学习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

                     }


    }

我从MSDN文章中找到了timer.change。但是我不确定如何在我的情况下实现它

我已经尝试过Thread.sleep()..但是我也在寻找其他可能的办法..任何建议都会有所帮助

我认为Artyom Kharlamov是正确的,如果您提供有关要实现的特定功能的更多详细信息,则有更好的机会获得更接近您所需的答案。

我对您目前介绍的内容的看法:

  1. 如果您希望服务在一天中的时间等于预定义值(例如,根据您提供的代码的16:48)时执行特定操作,我认为您的方法有点复杂,因为您可以通过以下方法更轻松地实现此目的使用“ 计划任务” ,它还可以解决您尝试在服务中执行操作的情况,而不是一天中的特定时间,而是每x的时间。
  2. 计时器对象似乎没有公开任何属性或方法,这些属性或方法将告诉您自其开始计时以来已经经过了多少时间,为此,只要调用SetTimer,就可以使用属性并获取当前时间,请在ASMSService1中设置属性类,并在调用FirstSlotOperations时获得与当前时间的差。

也许这并不是您真正想做的,但是除非您对自己的期望有更多的了解,否则很难有效地解决它们。

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

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

在回调函数中作为参数传递的对象是计时器对象,因此您无法从中获取数据。 例如,您只能将其用于对计时器对象进行操作。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM