сброс таймера при втором вызове

#c# #multithreading #timer

#c# #многопоточность #таймер

Вопрос:

Я здесь немного новичок…и изучение потоков.Таймер … У меня есть таймер в оконной службе, который запускает функцию в 16:48:00 .. Я просто хочу снова запустить таймер в 21:00: 00 вечера…затем 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() .. Но я также ищу какую-то альтернативу, если это возможно.. любое предложение было бы полезно

Комментарии:

1. Пожалуйста, более точно опишите, чего вы хотите от приведенного выше кода и какова цель использования timer?

2. Вы проверяли какие-либо примеры, подобные этому ?

3. На самом деле мне нужно выполнить какую-то конкретную операцию, если программа достигла определенного времени, установленного таймером

Ответ №1:

Я думаю, что Артем Харламов прав, если вы предоставите более подробную информацию о том, какую конкретную функциональность вы намерены достичь, есть больше шансов получить ответ, который ближе к тому, что вам нужно.

Мой взгляд на то, что вы сейчас представили:

  1. Если вы хотите, чтобы служба выполняла определенную операцию всякий раз, когда время суток равно предопределенному значению (например, 16:48 согласно предоставленному вами коду), я думаю, что ваш подход довольно сложный, поскольку вы могли бы добиться этого проще, используя запланированные задачи, которые также будут охватывать случайв котором вы пытаетесь выполнить операцию в своей службе не в определенное время дня, а каждые x промежутков времени.
  2. Объект timer, похоже, не предоставляет никаких свойств или методов, которые сообщали бы вам, сколько времени прошло с момента его первого запуска, для этого вы можете использовать свойства и получать текущее время при каждом вызове SetTimer, установить свойство в классе ASMSService1 и получить разницу с текущим временем при выполнении FirstSlotOperationsвызывается.

Возможно, это не совсем то, что вы хотите сделать, но если вы не будете немного более конкретны в своих ожиданиях, их трудно эффективно решить.

Ответ №2:

Вам не нужен какой-либо объект для получения текущего времени. Просто используйте:

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

Объект, переданный в качестве аргумента в функции обратного вызова, является объектом timer, поэтому вы не можете получить от него данные. Вы можете использовать его только для работы с объектом timer, например.

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

Комментарии:

1. Я отредактировал свою тему… На самом деле я хочу получить время, установленное таймером (16:48:00), указанное в коде .. Не текущее время.. Прошу прощения за это