Сброс или Отмена задержек задач на событии - PullRequest
0 голосов
/ 11 февраля 2020

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

В этом случае я хочу сбросить время задержки моей задачи и отменить все существующие задачи очереди, без перезапуска процесса.

Если кто-то может помочь мне добиться того же с помощью более оптимизированного кода, я буду благодарен.

Может ли кто-нибудь помочь мне сбросить время задержки моего задания для события.

        private static void ResetProcessWithNewTime(RealTimeMessage message)
        {
            // Need some code to reset the timer of all task
        }

        static void Main(string[] args)
        {
            List<RealTimeMessage> messages = GetRealTimeMessage();
            Parallel.ForEach(messages, (message) =>
            {
                processMessage(message);
            });

            Console.ReadLine();
        }

        private static async void processMessage(RealTimeMessage message)
        {
            try
            {
                if (!string.IsNullOrEmpty(message.IntervalTime))
                    ProceesRequest(message);

                while (true)
                {
                    double taskIntervalTime = GetTaskInterval(message);
                    await Task.Delay(TimeSpan.FromSeconds(taskIntervalTime));
                    await Task.Run(() => ProceesRequest(message));
                }
            }
            catch (Exception)
            {
                Console.WriteLine("Critical error on startup unable to send startup message");
            }
        }

        private static void ProceesRequest(RealTimeMessage message)
        {
            Stopwatch stopwatch = new Stopwatch();
            if (!stopwatch.IsRunning)
            {
                stopwatch.Start();

                //After excution
                Console.WriteLine(message.MessageText + " is running @ " + DateTime.Now);
                //

                stopwatch.Stop();
            }
        }
        private static double GetTaskInterval(RealTimeMessage message)
        {
            double delayTime;
            if (!string.IsNullOrEmpty(message.IntervalTime))
                delayTime = Convert.ToInt64(message.IntervalTime) * 60;
            else
                delayTime = GetNextTime(message.TimeOfDay);

            return delayTime;
        }

        private static double GetNextTime(string timeOfDay)
        {
            IEnumerable<TimeSpan> timeSpans = timeOfDay.Split(',').Select(x => TimeSpan.Parse(x));
            TimeSpan timeSpan = timeSpans.FirstOrDefault(x => x > DateTime.Now.TimeOfDay);
            return timeSpan.Subtract(DateTime.Now.TimeOfDay).TotalSeconds;
        }


        private static List<RealTimeMessage> GetRealTimeMessage()
        {
            List<RealTimeMessage> realTimeMessages = new List<RealTimeMessage>();
            realTimeMessages.Add(new RealTimeMessage { MessageText = "Message 1", IntervalTime = "", MessageType = "Connect", TimeOfDay = "10:20,12:30,22:40" });
            realTimeMessages.Add(new RealTimeMessage { MessageText = "Message 2", IntervalTime = "", MessageType = "AIDX_Version9_1", TimeOfDay = "10:20,12:30,22:40" });
            realTimeMessages.Add(new RealTimeMessage { MessageText = "Message 3", IntervalTime = "", MessageType = "AIDX_Version14_1", TimeOfDay = "10:20,12:30,22:40" });
            realTimeMessages.Add(new RealTimeMessage { MessageText = "Message 4", IntervalTime = "15", MessageType = "AIDX_Version16_1", TimeOfDay = "" });
            realTimeMessages.Add(new RealTimeMessage { MessageText = "Message 5", IntervalTime = "20", MessageType = "AMSX", TimeOfDay = "" });

            return realTimeMessages;
        }
...