0

我正在创建一个 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 到达时使用 Simple Timer 对进程的下一个动作采取行动之前,按最接近的“OnOff”TimeSpan 对“Process”字典进行排序。

我对这个计划的问题是 TimeSpan 的排序,并找出哪个“开始”/“停止”动作包含最接近的 TimeSpan 进行排序。此外,它可能是包含最接近 TimeSpan 的每个进程的不同操作。

或者谁能​​想到一种更简单的方法来实现相同类型的结果?

4

2 回答 2

0

由于计划信息始终存在于 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;
        }


    }
于 2013-12-12T10:57:00.393 回答
0

为什么不只保留一个结构

`class ProcessInfo
{
String ProcessID;
TimeSpan startTime;
TimeSpan endTime;
}`

并保持字典的结构简单 只需在需要添加到列表时Dictionary<string,ProcessInfo> schedule = new Dictionary<string,ProcessInfo>(); 创建一个新的processinfo对象

于 2013-10-11T12:11:26.590 回答