如何对多维字典的内部值进行排序
本文关键字:内部 排序 字典 | 更新日期: 2023-09-27 18:34:50
我正在创建一个Windows服务,该服务控制一堆其他进程,但内部进程需要按照自己的计划运行。每个计划都相对简单,只需选择它们在一周中的哪几天运行,何时开始流程以及何时停止。
我的想法是有一个多维字典
,如下所示Dictionary<string, TimeSpan> OnOff = new Dictionary<string,TimeSpan>();
OnOff.Add("Start", TimeSpan.Parse("09:00"));
OnOff.Add("Stop", TimeSpan.Parse("17:00"));
Dictionary<string, Dictionary<string, TimeSpan>> Process = new Dictionary<string,Dictionary<string,TimeSpan>>();
Process.Add("Process1", OnOff);
Dictionary<DayOfWeek, Dictionary<string, Dictionary<string, TimeSpan>>> schedule = new Dictionary<DayOfWeek,Dictionary<string,Dictionary<string,TimeSpan>>>();
schedule.Add(DayOfWeek.Monday, Process);
并按最接近的"开关"时间跨度对"进程"字典进行排序,然后再使用简单计时器在 TimeSpan 到达时对进程的下一个操作进行操作。
我对这个计划的问题是对时间跨度进行排序,并找出哪个"开始"/"停止"操作包含最接近的排序时间跨度。此外,它可能是包含最接近 TimeSpan 的每个进程的不同操作。
或者谁能想到一种更简单的方法来达到相同类型的结果?
为什么不只保留一个结构
`class ProcessInfo
{
String ProcessID;
TimeSpan startTime;
TimeSpan endTime;
}`
并保持字典的结构简单 Dictionary<string,ProcessInfo> schedule = new Dictionary<string,ProcessInfo>();
只需在需要添加到列表时创建一个新的进程信息对象
由于计划信息始终存在于 App.Config 文件中,我决定不需要将其存储在其他地方。我处理调度的方法是找到所有需要在不久的将来采取行动的流程,并只存储这些流程详细信息、调度时间和所需的操作。
然后我只是运行一个计时器,并在计划时间执行启动或停止操作。处理完所有这些进程后,我再次查看了 App.Config,并找到了下一个要处理的进程列表。
// The method that will be called when the schedule thread is started
private void ProcessSchedule()
{
Thread.CurrentThread.CurrentCulture = new CultureInfo("en-GB");
// work out the length of time between now and the schedule time
string today = DateTime.Now.ToString("dd.MM.yyy");
DateTime abaseTime = Convert.ToDateTime(today);
TimeSpan scheduleTime = schedules.First().Value.ActionTime;
DateTime actionTime = abaseTime.Add(scheduleTime);
// log the schedule is starting
if (log.IsInfoEnabled) log.Info(String.Format("Schedule created. Next action will take place at {0}", actionTime.ToString()));
while (Running)
{
// this kills this process
if (threadStop.WaitOne(0))
{
if (log.IsInfoEnabled) log.Info(String.Format("Schedules cancelled"));
break;
}
if (DateTime.Now < actionTime)
{
//sleep 5 seconds before checking again. If we go any longer we keep our service from shutting down when it needs to.
threadStop.WaitOne(5000);
continue;
}
// tell the service control that it can action the schedules now
ServiceControl.actionSchedule.Set();
break;
}
}