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 が到着したときにシンプル タイマーを使用してプロセスの次のアクションを実行する前に、"Process" ディクショナリを最も近い "OnOff" TimeSpan で並べ替えます。

この計画に関する私の問題は、TimeSpans の並べ替えと、並べ替えに最も近い 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;
}`

辞書の構造をシンプルに保ち、 リストに追加する必要があるときにprocessinfoDictionary<string,ProcessInfo> schedule = new Dictionary<string,ProcessInfo>(); の新しいオブジェクトを作成するだけです

于 2013-10-11T12:11:26.590 に答える