Я написал некоторый код для запуска нескольких задач на основе списка конфигурации, он работает нормально, но у меня есть новое требование, когда время моего списка конфигурации может быть изменено во время выполнения.
В этом случае я хочу сбросить время задержки моей задачи и отменить все существующие задачи очереди, без перезапуска процесса.
Если кто-то может помочь мне добиться того же с помощью более оптимизированного кода, я буду благодарен.
Может ли кто-нибудь помочь мне сбросить время задержки моего задания для события.
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;
}